mfc dialog最小化后list不显示_MFC窗口美化之背景自绘

07cc2ca5f2ae2b5cb4082a708f70499f.png

一个优秀的应用程序,除了拥有实用的功能之外,外观是否做的好看,也是很重要的。就如同现实生活中,找女朋友是一样的。长的好看的女孩子,肯定要比长的一般的女孩子更受关注。不可否认 不论是找女朋友; 还是应用程序 。好看的外观只占据了一部分,更多的是要看 内在(实用功能),如果没有良好的内在(实用功能),那么外观弄的在好看都没有用 。

默认界面

首先用MFC图形框架新建一个图形界面程序,界面风格是默认的windows风格。如果对界面没啥要求,这样的界面也基本够用了。没有对比就没有伤害,如果拿这样的界面程序和QQ对比,就会感觉弱爆了。

7d134b2c3ade4d52607b6e82de27aee9.png
界面绘制

接着把窗口默认的边框去掉,把窗口的Border属性改为None。这样就把窗口的默认边框去除掉了,默认的边框不需要,绘制操作主要是在客户区域完成。图标已经最大化按钮和最小化按钮都自行绘制。

9a4177336d52630cbe66497ad8a37dec.png
OnInitDialog()函数

接着打开程序的MFCApplication1Dlg.cpp实现文件,在窗口初始化OnInitDialog()函数的后面添加以下代码。除此之外还需要在 MFCApplication1Dlg.h声明文件中,添加 一行 CBrush m_bkBrush;,用来声明 m_bkBrush这个变量。注意背景图片的路径,需要在当前目录下的res目录,添加一张名为bgimg.png的图片。

CString strBmpPath = _T(".resbgimg.png");

	CImage img;

	img.Load(strBmpPath);

	MoveWindow(0, 0, img.GetWidth(), img.GetHeight());

	CBitmap bmpTmp;

	bmpTmp.Attach(img.Detach());

	m_bkBrush.CreatePatternBrush(&bmpTmp);
OnCtlColor函数

下面需要重载一下 OnCtlColor这个函数,点击类视图-->点击窗口类-->消息-->OnCtlColor, 然后在cpp文件下的OnCtlColor函数中,添加以下的几句代码。OnCtlColor函数主要是返回窗口在绘制前用到的画刷资源,只要把我们创建的画刷,让这个函数返回就行了。这样就完成窗口的背景替换了,运行程序看看你的窗口背景有没有成功被替换。

cb310a84f79093e467a8ace991bd2046.png
OnNcHitTest函数

但是你会发现背景被替换后,但是窗口不能正常拖动了。接着需要按照上一个步骤,重载一下OnNcHitTest函数,在OnNcHitTest函数下添加以下俩行代码,OnNcHitTest函数主要是判断鼠标的光标是否在客户区,现在因为默认的边框去掉了。光标一直停留在客户区,所以窗口就移动不了了,这俩行代码主要是让窗口可以正常移动。

b69878c23cd42adfe023f9d51551bb75.png
效果演示

这是我随便选取的一张图片,看上去效果可能不是很好。当然 如果你们会PS的,可以把背景做的更加高大上一点。我这边就随便找一张图片凑合一下了,程序的四个角是圆角的,截图不完整可能看不到边框的圆角,如需把边框变成圆角的,还需在OnInitDialog()函数下面添加如下代码:

CRgn rgnTmp;
	RECT rc;
	GetClientRect(&rc);
	rgnTmp.CreateRoundRectRgn(rc.left + 1, rc.top + 1, rc.right+3, rc.bottom- 2, 6,6);
	SetWindowRgn(rgnTmp, TRUE);

aded8ff7c7d90b12dd4fe0b9d5547a3f.png

像写程序方面的文章,因为涉及到代码很多,可能讲的不是很明白。不过没关系,有时间我会录制教程上传到哔哩哔哩。下遍文章给大家讲解一下按钮的美化,如果你会C或是C++,还是看不懂MFC,可以看一下《老密查询”软件开发之界面设计(一)我这篇文章下面,上传的C++和MFC的基础教程。

文章声明
此文章只用于技术交流学习,切勿用作非法用途,否则后果自负。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值