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

server/2024/11/16 21:40:49/

目前使用CImage和CBitmap两个类,还有是将CImage转CBitmap显示。

MFC界面拖拽一个button按钮和一个Picture Control控件。

1.CImage显示。这种方式显示图片会有颜色不对的情况

void Cpicture_test_controlDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CImage image;HRESULT hResult = image.Load("D:\\jpeg.bmp");if (!SUCCEEDED(hResult)) {AfxMessageBox("imread error");}//获取picture control 句柄CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);//获取控件大小CRect rect;pStatic->GetClientRect(&rect);int controlWidth = rect.Width();int controlHeight = rect.Height();//获取图片原始尺寸int imageWidth = image.GetWidth();int imageHeight = image.GetHeight();//创建兼容的DCCDC *pDC = pStatic->GetDC();CDC memDC;memDC.CreateCompatibleDC(pDC);//创建兼容的位图,并选入内存DCCBitmap bmp;bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);CBitmap* pOldbmp = memDC.SelectObject(&bmp);BITMAP bmpInfo;bmp.GetBitmap(&bmpInfo); // 获取位图信息//清空背景memDC.FillSolidRect(&rect, pDC->GetBkColor());//使用CImage绘制倒内存DC, 这里使用缩放image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);//将内存DC绘制到控件上pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);//清理memDC.SelectObject(pOldbmp);ReleaseDC(pDC);
}

2.CBitmap显示

void Cpicture_test_controlDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码//需要再资源视图中增加资源,资源类型为BitmapCBitmap img;if (!img.LoadBitmap(IDB_BITMAP2)) {AfxMessageBox("imread error");}// 获取Picture Control的设备上下文CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);CDC *pDC = pStatic->GetDC();// 获取对话框和图片的尺寸CRect rect;pStatic->GetClientRect(&rect);BITMAP bmpInfo;img.GetBitmap(&bmpInfo);// 创建兼容的内存设备上下文CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = memDC.SelectObject(&img);// 绘制缩放后的图片int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);pDC->SetStretchBltMode(iStretchMode);// 清理memDC.SelectObject(pOldBitmap);ReleaseDC(pDC);
}

3.将CImage转CBitmap显示。有两种方式

void Cpicture_test_controlDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CImage image;HRESULT hResult = image.Load("D:\\jpeg.bmp");if (!SUCCEEDED(hResult)) {AfxMessageBox("imread error");}HBITMAP hBitmap = image.Detach();CBitmap img;img.DeleteObject();img.Attach(hBitmap);// 获取Picture Control的设备上下文CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);CDC *pDC = pStatic->GetDC();// 获取对话框和图片的尺寸CRect rect;pStatic->GetClientRect(&rect);BITMAP bmpInfo;img.GetBitmap(&bmpInfo);// 创建兼容的内存设备上下文CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = memDC.SelectObject(&img);// 绘制缩放后的图片int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);pDC->SetStretchBltMode(iStretchMode);// 清理memDC.SelectObject(pOldBitmap);ReleaseDC(pDC);}
void Cpicture_test_controlDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CImage image;HRESULT hResult = image.Load("D:\\jpeg.bmp");if (!SUCCEEDED(hResult)) {AfxMessageBox("imread error");}HBITMAP hBitmap = image.Detach();CBitmap *img = CBitmap::FromHandle(hBitmap);// 获取Picture Control的设备上下文CStatic *pStatic = (CStatic*)GetDlgItem(IDC_STATIC_PC);CDC *pDC = pStatic->GetDC();// 获取对话框和图片的尺寸CRect rect;pStatic->GetClientRect(&rect);BITMAP bmpInfo;img->GetBitmap(&bmpInfo);// 创建兼容的内存设备上下文CDC memDC;memDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap = memDC.SelectObject(img);// 绘制缩放后的图片int iStretchMode = pDC->SetStretchBltMode(COLORONCOLOR); // 色彩保留pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);pDC->SetStretchBltMode(iStretchMode);// 清理memDC.SelectObject(pOldBitmap);ReleaseDC(pDC);}


http://www.ppmy.cn/server/142471.html

相关文章

新增支持Elasticsearch数据源,支持自定义在线地图风格,DataEase开源BI工具v2.10.2 LTS发布

2024年11月11日,人人可用的开源BI工具DataEase正式发布v2.10.2 LTS版本。 这一版本的功能变动包括:数据源方面,新增了对Elasticsearch数据源的支持;图表方面,对地图类和表格类图表进行了功能增强和优化,增…

centos7安装Chrome使用selenium-wire

背景:在centos7中运行selenium-wire爬虫,系统自带的Firefox浏览器不兼容,运行报错no attribute ‘set_preference’,应该是selenium-wire和Firefox的驱动不兼容 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上…

报错 No available slot found for the embedding model

报错内容 Server error: 503 - [address0.0.0.0:12781, pid304366] No available slot found for the embedding model. We recommend to launch the embedding model first, and then launch the LLM models. 目前GPU占用情况如下 解决办法: 关闭大模型, 先把 embedding mode…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明

4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明 文章目录 4. Spring Cloud Ribbon 实现“负载均衡”的详细配置说明前言1. Ribbon 介绍1.1 LB(Load Balance 负载均衡) 2. Ribbon 原理2.2 Ribbon 机制 3. Spring Cloud Ribbon 实现负载均衡算法-应用实例4. 总结&#x…

服务器操作

删除文件 删除当前目录下所有文件&#xff08;不包括子目录中的文件&#xff09;&#xff1a; rm -f *可删除文件夹以及文件夹中的文件 rm -rf 文件名 可删除多个文件夹以及文件夹中的文件 rm -rf 文件名1 文件名2 删除当前目录下所有文件及子目录中的文件&#xff1a…

基于.NET 9实现实时进度条功能:前后端完整示例教程

要在基于.NET 9的应用中实现进度条功能&#xff0c;我们可以通过HttpContext.Response来发送实时的进度更新到前端。以下是一个简单的示例&#xff0c;展示了如何在ASP.NET Core应用中实现这一功能。 但是&#xff0c;我在.net framework4.7.2框架下&#xff0c;实际不了HttpC…