先说一下实现的功能:
简单地说,就是,在一个对话框中有一个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();
}
完毕,主要实现就是以上这些,希望能帮助到朋友们...