MFC:如何将JPEG等图片显示到对话框客户区

步骤:

0、打开VS2022创建一个基于对话框的MFC应用,项目名称命名为PicShow,创建完成后将对话框客户区中的"确定"按钮等内容删除(具体步骤略)。

1、建立菜单栏:文件->打开、退出。具体步骤:在解决方案管理器中,a.右键项目名称 PicShow,b.选择添加,c.选择资源,d.选择Menu后点击"新建";进入菜单编辑界面后先写上"文件"然后在其下拉位置分别写上"打开"和"退出"。

右键对话框,选择属性,找到属性栏中的"菜单",在下拉中选入建立资源IDR_MENU1。

此时,运行程序已经能够正常显示菜单。

2、回到菜单编辑界面,右键"打开"选择添加处理程序,类列表选择"CPicShowDlg",函数名改为OnOpen,其余按照缺省。

这段内容是本文的核心,包括选择图片文件和显示图片,CPicShowDlg::OnOpen()具体代码及注释如下:

/************************************************************/

//(一)选择要显示的图片(获取图片文件的文件名及路径)

CString fileName; //声明保存图片文件路径及名称的字符串对象

CFileDialog openDlg(TRUE, NULL, NULL, OFN_HIDEREADONLY, L"All Files(*.*)||", AfxGetMainWnd(), 0UL, 1); // 设置打开文件对话框

openDlg.DoModal(); //运行打开文件对话框

fileName = openDlg.GetPathName(); //获得文件名及路径并保存到字符串变量中

//(二)显示图片

// 显示图片分几个步骤,首先获取客户区设备上下文指针并对客户区清屏;然后,声明CImage对象img并将图片载入img;接着,

// 通过调用img成员函数Draw将图片显示到对话框客户区。注意显示前需调用SetStretchBltMode函数以保证颜色显示不失真。

//步骤一:

CDC* pDC; //声明设备上下文类对象指针

pDC = this->GetDC(); //获得客户区设备上下文指针

CRect rect; //声明矩形结构

GetClientRect(&rect); //获取客户区数据并存入rect矩形结构

pDC->FillRect(rect, (CBrush*)pDC->SelectStockObject(5));//清除客户区旧有内容(实际为使用背景色填充客户区)

//步骤二:

CImage img; //声明CImage对象

img.Load(fileName); //将第一步骤选择的图片载入

//步骤三:

::SetStretchBltMode(*pDC, COLORONCOLOR); //首先设置图形拉伸变形时的颜色处理模式,保证颜色不失真

if (rect.Width() / rect.Height() > img.GetWidth() / img.GetHeight())

//判断客户区宽高比例与源图宽高比例哪个更大一些

{

img.Draw(pDC->m_hDC, 0, 0, rect.Height()*img.GetWidth()/img.GetHeight(), rect.Height(),0, 0, img.GetWidth(), img.GetHeight());

//客户区宽高比大于图片宽高比显示语句

}

else

{

img.Draw(pDC->m_hDC, 0,0,rect.Width(), rect.Width()*img.GetHeight()/img.GetWidth(),0, 0, img.GetWidth(), img.GetHeight());

//客户区宽高比小于图片宽高比显示语句

}

pDC->DeleteDC(); //释放设备上下文指针

/************************************************************/

3、回到菜单编辑界面,右键"退出"选择添加处理程序,类列表选择"CPicShowDlg",函数名改为OnQuit,其余按照缺省。

语句只写一句:

/************************************************************/

EndDialog(0); //关闭对话框

/************************************************************/

以上,是采用基于对话框的MFC应用显示图片的大致过程,达到了显示图片不变色、不变形的目的,供有相同兴趣的朋友参考。

相关推荐
莫等闲-19 分钟前
代码随想录一刷记录Day44——leetcode1143.最长公共子序列 53. 最大子序和
数据结构·c++·算法·leetcode·动态规划
承渊政道23 分钟前
【动态规划算法】(背包问题经典模型与解题套路)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
weixin_4217252633 分钟前
2026年C/C++/C#全解析:底层语言的进化与场景抉择,选错直接掉队
c语言·c++·c·编程语言·技术选择
我头发多我先学1 小时前
C++ 红黑树:从规则到实现,手把手带你写一棵红黑树
数据结构·c++·算法
lzh200409191 小时前
深入学习Linux进程间通信:解析消息队列
linux·c++
水饺编程1 小时前
第5章,[标签 Win32] :设备的尺寸(三)
c语言·c++·windows·visual studio
Cando学算法1 小时前
中位数定理:到所有点的距离之和最小的点就是中位数
c++·算法·学习方法
HZY1618yzh1 小时前
洛谷题解:P16304 [蓝桥杯 2026 省 Java C 组] 抽奖活动
java·c++·算法·蓝桥杯
智者知已应修善业2 小时前
【51单片机从奇数始再转偶数逐一点亮并循环】2023-9-8
c++·经验分享·笔记·算法·51单片机
努力努力再努力wz2 小时前
【MySQL进阶系列】拒绝冗余SQL:带你透彻理解视图的底层逻辑
android·c语言·数据结构·数据库·c++·sql·mysql