您的位置:首页 > 其它

在vc控件中显示图片,点击按钮变换图片

2012-11-11 17:15 471 查看
先说一下实现的功能:

简单地说,就是,在一个对话框中有一个Picture控件和一个浏览按钮,就这两个东东,需要实现的功能是,点击浏览按钮的时候出现一个打开对话框,选择一张图片,点击确定后,将图片显示到Picture控件上。

开始界面如下:



点击浏览,选中图片后,点击确定后显示图片如下:



代码实现(我是在一个对话框中实现的这个功能):

void CShowPicDlg::OnScan()//点击浏览按钮的响应函数

{

CFileDialog fileDlg(TRUE);

fileDlg.m_ofn.lpstrFilter = "BMP Files(*.bmp)\0*.bmp\0\0"; //在此,只能显示.bmp的图片

fileDlg.m_ofn.lpstrTitle = "图片选择对话框";

fileDlg.m_ofn.lpstrDefExt = "*.bmp";

fileDlg.m_ofn.lpstrInitialDir = "c:\\";

if(IDOK == fileDlg.DoModal()) //打开文件

{

m_imagePath = fileDlg.GetPathName(); //保存图片路径的成员变量

if(!m_imagePath.IsEmpty()) //确定是否已经选中了图片,后面需要分辨这两种情况

m_hasBmp = TRUE;

else

m_hasBmp = FALSE;

m_imageName = fileDlg.GetFileName(); //保存图片名字

SetDlgItemText(IDC_EDIT_IMAGEPATH, m_imagePath); //将路径名显示在浏览按钮左边的编辑框中

PostMessageWM_ON_SHOW_PIC, 0, 0); //发送显示图片的消息

}

}

自定义显示图片的消息响应函数:

#define WM_ON_SHOW_PIC WM_USER + 10

afx_msg void OnShowPic(); //消息声明

ON_MESSAGE(WM_ON_RENDER_PIC, OnShowPic)

void CShowPicDlg::OnShowPic() //函数实现

{

if( m_bmp.m_hObject != NULL )//判断

m_bmp.DeleteObject();

HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),

m_imagePath, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);

if(hbmp == NULL) //加载图片失败,刷新控件,并返回

{

Invalidate();

return ;

}

//该断程序用来取得加载的BMP的信息

m_bmp.Attach(hbmp);

DIBSECTION ds;

BITMAPINFOHEADER &bminfo = ds.dsBmih;

m_bmp.GetObject(sizeof(ds), &ds);

int cx=bminfo.biWidth;//获取图像宽度

int cy=bminfo.biHeight; //获取图像高度

CRect rect;

GetDlgItem(IDC_STC_PIC)->GetWindowRect(&rect);

ScreenToClient(&rect);

GetDlgItem(IDC_STC_PIC)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整控件大小

InvalidateRect(rect); //刷新对话框,执行OnPait函数

return ;

}

void CShowPicDlg::OnPaint()

{

CPaintDC dc(GetDlgItem(IDC_STC_PIC)); //得到Picture控件的DC

CRect rcclient;

GetDlgItem(IDC_STC_PIC)->GetClientRect(&rcclient);

CDC memdc;

memdc.CreateCompatibleDC(&dc); //创建兼容DC

CBitmap bitmap;

bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height()); //创建兼容位图,长宽是控件的长宽

memdc.SelectObject(&bitmap); //选择位图到兼容DC

CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0);

CBrush brush;

if(m_hasBmp) //如果有图像

brush.CreatePatternBrush(&m_bmp); //用图像填充画刷

else

brush.CreateSolidBrush(m_bkClr); //否则,用颜色填充(你想用什么颜色就用什么颜色)

dc.FillRect(rcclient, &brush); //填充

dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),

&memdc, rcclient.left, rcclient.top,SRCPAINT);

brush.DeleteObject();

}

完毕,主要实现就是以上这些,希望能帮助到朋友们...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐