现在的位置: 首页 > 综合 > 正文

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

2013年10月08日 ⁄ 综合 ⁄ 共 2281字 ⁄ 字号 评论关闭

先说一下实现的功能:
简单地说,就是,在一个对话框中有一个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();
}

完毕,主要实现就是以上这些,希望能帮助到朋友们...

抱歉!评论已关闭.