MFC 之基本界面配置

不经常写 MFC 程序,虽然 MFC 的基础界面配置较为简单,但是每次很久没写 MFC,再写的时候各种搜资料感觉还是挺麻烦的,所以写一个 MFC 的基本界面配置笔记,主要记录如何设置窗体大小、设置程序标题、设置版权信息、修改图标、添加最大化最小化按钮、添加背景图等等,方便后续查阅。

当然,我们首先要新建一个 MFC 应用程序,并在配置界面将“应用程序类型”设置为基于对话框

一、修改窗体大小

直接在资源视图中将主对话框拖拽到自己想要显示的尺寸即可。如果想要将窗体大小固定不允许运行时调整大小,在窗体属性中将边框设置为 对话框外框

二、添加最小化和最大化按钮按钮

创建窗体右上角默认只有关闭按钮,如果我们想添加最大化和最小化按钮,我们可以在窗体属性中找到最大化框和最小化框进行设置:

三、设置程序标题

在窗体属性中找到描述文字进行设置:

四、设置版权信息

在资源视图中找到 VS_VERSION_INFO 进行相应的版权信息编辑:

五、修改图标

想要修改图标,我们首先需要制作一个图标文件,图标文件是以 .ico 后缀名结尾的文件,我们可以将我们想要作为图标的 jpg 等格式的文件在下面网址转换成 24*24 大小的 ico 图标文件:
https://www.toolhelper.cn/Image/ImageToIco

制作完成后,我们就可以对程序图标进行修改了,程序图标、任务管理器图标和程序左上角的图标用的都是共用一个的,有两种方法可以进行修改:

方法一

第一种方法比较简单,我们在程序编译目录中找到默认图标文件,然后将我们的图标文件修改成默认图标文件的文件名,然后对其进行替换,重新编译生成即可,生成后因为计算机缓存,所以我们生成的程序图标仍然显示为原来的图标,只要将其复制到其他文件夹,就可以更新了。

方法二

第二种方法就是插入一个 ico 图标资源文件,然后在代码中调用。

我们直接在资源视图中右键 ico -> 添加资源:

然后我们就会在 Resource.h 头文件中看到我们的资源已经被添加进去了,并且自动生成了对应的资源 ID:

最后我们在界面对应的源文件中将默认图标资源 ID 修改为我们添加的图标即可:

六、设置窗体背景图片

同样,在设置窗体背景图片之前,我们需要加载相应的图片资源,当然不是所有格式的图片资源都可以直接在 VS 中进行编译,实际上它只支持 bmp 位图,当然我们可以通过其他方法,让它乖乖变成位图。

那我们从网络上随便找一张,为了更好地演示怎么把一张高清图变成位图,我们特地找一张高清晰度且大小为 3.58M 的 jpg 图片(随便找的,侵权联系删除,感谢理解):

那我们现在开始将图片转为 bmp 格式,在网上找了很多方法,效果都不尽人意,因为位图最多只能显示 256 种颜色,那我们现在网上随便找一张图片,颜色都远远超过 256,有些朋友可能会有 windows 系统自带的画图工具转位图,但是大概率是会造成失真的,而且这程度属实难以接受:

后面我想到用 PS 软件试试,把图片拖进去,直接另存为 bmp,结果出乎意料,果然专业的事情还是要交给专业的人做,PS 能成为作为图片处理的扛把子,确实是有点实力,在转换成位图后还能保持原来图片的效果,反正我肉眼是观察不出来区别,只是文件大小从 3.58M 变成了 23.7M,当然我们也接受不了这么大一个图片资源文件一起编译成 exe...

不过这个都是小问题了,推荐一个觉得压缩效果还不错且不怎么失真的免费网址:

https://freecompress.com/zh-cn/compress-image

设置合适的压缩级别(太高会失真),然后上传图片,然后压缩成了 169K,压缩效果还不错,而且失真度也能接受:

好了,准备工作都做完了,现在终于可以在我们的程序中贴上美美的背景图了~

我们在资源视图中右键 项目 -> 添加资源:

添加完成后,在资源视图的 Bitmap 文件中,我们可以看到我们刚刚添加的图片资源 ID 为 IDB_BITMAP1

然后我们在界面源文件中找到 void CxxDlg::OnPaint() 函数,将 if 判断下面 else 里面的 CDialogEx::OnPaint() 注释掉:

然后在 else 下面添加我们的代码,将背景图片加载并显示出来:

// 添加代码对话框背景贴图
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);    // 获取对话框长宽(窗口内部区域,不包括窗口的边框和标题栏)     
CDC dcBmp;             // 定义并创建一个内存设备环境
dcBmp.CreateCompatibleDC(&dc);  // 创建兼容性DC(这意味着 dcBmp 可以与 dc 共享 GDI 对象,如位图和画笔)
CBitmap bmpBackground;    // 用于存储位图图像
bmpBackground.LoadBitmap(IDB_BITMAP1);    // 载入资源中图片
BITMAP m_bitmap;                         // 图片变量               
bmpBackground.GetBitmap(&m_bitmap);       // 将图片载入位图中										  
CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);    // 将位图选入临时内存设备环境
// 调用StretchBlt函数,将dcBmp中的位图绘制到dc(窗口客户区)上。
// StretchBlt函数会根据目标矩形和源矩形的大小进行缩放
dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);

效果如下:

posted @ 2024-09-23 14:16  lostin9772  阅读(332)  评论(0)    收藏  举报