MFC中Picture Control控件显示照片的几种方式

打印 上一主题 下一主题

主题 1399|帖子 1399|积分 4197

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目前使用CImage和CBitmap两个类,还有是将CImage转CBitmap显示。
MFC界面拖拽一个button按钮和一个Picture Control控件。
1.CImage显示。这种方式显示图片会有颜色不对的情况
  1. void Cpicture_test_controlDlg::OnBnClickedButton1()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         CImage image;
  5.         HRESULT hResult = image.Load("D:\\jpeg.bmp");
  6.         if (!SUCCEEDED(hResult)) {
  7.                 AfxMessageBox("imread error");
  8.         }
  9.         //获取picture control 句柄
  10.         CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
  11.        
  12.         //获取控件大小
  13.         CRect rect;
  14.         pStatic->GetClientRect(&rect);
  15.         int controlWidth = rect.Width();
  16.         int controlHeight = rect.Height();
  17.         //获取图片原始尺寸
  18.         int imageWidth = image.GetWidth();
  19.         int imageHeight = image.GetHeight();
  20.         //创建兼容的DC
  21.         CDC *pDC = pStatic->GetDC();
  22.         CDC memDC;
  23.         memDC.CreateCompatibleDC(pDC);
  24.         //创建兼容的位图,并选入内存DC
  25.         CBitmap bmp;
  26.         bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);
  27.         CBitmap* pOldbmp = memDC.SelectObject(&bmp);
  28.         BITMAP bmpInfo;
  29.         bmp.GetBitmap(&bmpInfo); // 获取位图信息
  30.         //清空背景
  31.         memDC.FillSolidRect(&rect, pDC->GetBkColor());
  32.         //使用CImage绘制倒内存DC, 这里使用缩放
  33.         image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);
  34.         //将内存DC绘制到控件上
  35.         pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);
  36.         //清理
  37.         memDC.SelectObject(pOldbmp);
  38.         ReleaseDC(pDC);
  39. }
复制代码
2.CBitmap显示
  1. void Cpicture_test_controlDlg::OnBnClickedButton1()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         //需要再资源视图中增加资源,资源类型为Bitmap
  5.         CBitmap img;
  6.         if (!img.LoadBitmap(IDB_BITMAP2)) {
  7.                 AfxMessageBox("imread error");
  8.         }
  9.         // 获取Picture Control的设备上下文
  10.         CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
  11.         CDC *pDC = pStatic->GetDC();
  12.         // 获取对话框和图片的尺寸
  13.         CRect rect;
  14.         pStatic->GetClientRect(&rect);
  15.         BITMAP bmpInfo;
  16.         img.GetBitmap(&bmpInfo);
  17.         // 创建兼容的内存设备上下文
  18.         CDC memDC;
  19.         memDC.CreateCompatibleDC(pDC);
  20.         CBitmap* pOldBitmap = memDC.SelectObject(&img);
  21.         // 绘制缩放后的图片
  22.         int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
  23.         pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
  24.         pDC->SetStretchBltMode(iStretchMode);
  25.         // 清理
  26.         memDC.SelectObject(pOldBitmap);
  27.         ReleaseDC(pDC);
  28. }
复制代码
3.将CImage转CBitmap显示。有两种方式
  1. void Cpicture_test_controlDlg::OnBnClickedButton1()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         CImage image;
  5.         HRESULT hResult = image.Load("D:\\jpeg.bmp");
  6.         if (!SUCCEEDED(hResult)) {
  7.                 AfxMessageBox("imread error");
  8.         }
  9.         HBITMAP hBitmap = image.Detach();
  10.         CBitmap img;
  11.         img.DeleteObject();
  12.         img.Attach(hBitmap);
  13.         // 获取Picture Control的设备上下文
  14.         CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
  15.         CDC *pDC = pStatic->GetDC();
  16.         // 获取对话框和图片的尺寸
  17.         CRect rect;
  18.         pStatic->GetClientRect(&rect);
  19.         BITMAP bmpInfo;
  20.         img.GetBitmap(&bmpInfo);
  21.         // 创建兼容的内存设备上下文
  22.         CDC memDC;
  23.         memDC.CreateCompatibleDC(pDC);
  24.         CBitmap* pOldBitmap = memDC.SelectObject(&img);
  25.         // 绘制缩放后的图片
  26.         int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
  27.         pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
  28.         pDC->SetStretchBltMode(iStretchMode);
  29.         // 清理
  30.         memDC.SelectObject(pOldBitmap);
  31.         ReleaseDC(pDC);
  32. }
复制代码
  1. void Cpicture_test_controlDlg::OnBnClickedButton1()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         CImage image;
  5.         HRESULT hResult = image.Load("D:\\jpeg.bmp");
  6.         if (!SUCCEEDED(hResult)) {
  7.                 AfxMessageBox("imread error");
  8.         }
  9.         HBITMAP hBitmap = image.Detach();
  10.         CBitmap *img = CBitmap::FromHandle(hBitmap);
  11.         // 获取Picture Control的设备上下文
  12.         CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);
  13.         CDC *pDC = pStatic->GetDC();
  14.         // 获取对话框和图片的尺寸
  15.         CRect rect;
  16.         pStatic->GetClientRect(&rect);
  17.         BITMAP bmpInfo;
  18.         img->GetBitmap(&bmpInfo);
  19.         // 创建兼容的内存设备上下文
  20.         CDC memDC;
  21.         memDC.CreateCompatibleDC(pDC);
  22.         CBitmap* pOldBitmap = memDC.SelectObject(img);
  23.         // 绘制缩放后的图片
  24.         int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留
  25.         pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
  26.         pDC->SetStretchBltMode(iStretchMode);
  27.         // 清理
  28.         memDC.SelectObject(pOldBitmap);
  29.         ReleaseDC(pDC);
  30. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表