在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现。今天我们来说一下如何用MFC美化对话框,默认情况下,对话框的背景如下:

那么,我们如何将它的背景变成如下界面呢,而且还要保留对话框的移动功能,漂亮背景如下:

为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话框或者它的子控件需要重绘时,我们的对话框都会收到这个消息,

因此,我们需要为对话框添加WM_CTLCOLOR的消息响应函数,完成对消息的处理,WM_CTLCOLOR的响应函数定义如下:

HBRUSH CMFCDialogUIDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd == this){return m_bkBrush;}return hbr;
}

当我们的对话框需要重绘的时候,我们的对话框就会收到WM_CTLCOLOR消息,然后我们的对话框处理函数会调用OnCtlColor函数来处理该消息,在这个函数中,pDC代表我们要绘制的上下文环境,pWnd代表我们要绘制的窗口指针,nCtlColor代表我们要绘制的窗口类型,在函数的内部我们首先调用父类的OnCtlColor,目的是为了对该消息做默认处理,这是MFC消息响应函数的惯用写法,但是在我们这里,我们不能使用默认处理返回的画刷,所以我们需要做一个特殊的判断,如果pWnd指向的窗口地址是当前对话框,那么我们就返回m_bkBrush,这个画刷是一个图像画刷,它会在我们的对话框客户区绘制我们想让它显示的图片。下面我们看一下m_bkBrush是如何创建的,首先在我们的对话框的头文件中增加一个CBrush变量,变量名是m_bkBrush,然后在对话框的OnInitDialog中初始化它,OnInitDialog的定义如下:

BOOL CMFCDialogUIDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);           // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标// TODO:  在此添加额外的初始化代码CString strBmpPath = _T(".\\res\\Background.png");CImage img;img.Load(strBmpPath);MoveWindow(0, 0, img.GetWidth(), img.GetHeight());CBitmap bmpTmp;bmpTmp.Attach(img.Detach());m_bkBrush.CreatePatternBrush(&bmpTmp);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

现在我们看一下,在OnInitDialog中,我们都做了什么,首先,我们创建了一个CString变量strBmpPath,用它指向我们的图片文件,然后我们创建了一个CImage变量img,这个变量可以方便的加载各种格式的图像文件,所以我们使用它的目的是为了方便加载png格式的文件,MoveWindow的目的是为了调整我们的对话框客户区的大小,使客户区的大小与图片的大小一致,然后我们创建了一个CBitmap类型变量bmpTmp,使用它是因为CBrush的成员函数CreatePatternBrush的参数要求输入这种类型的参数,所以必须将img转换成CBitmap,转换的方法是bmpTmp.Attach(img.Detach()),img.Detach会释放图像的句柄,并且返回这个句柄,bmpTmp使用Attach绑定img返回的图像句柄,从而完成了对象类型的转换,最后调用CreatePatternBrush,这个函数的功能是使用传递给它的图像创建一个图像画刷,然后在OnCtlColor中,使用它填充对话框的背景,程序运行效果如下:

现在虽然程序的客户区已经变成了对话框的背景,但是对话框原来的标题栏和背景图片的标题栏重复,看起来很别扭,通过设置对话框的Border属性可以消除原来的标题栏,设置如下:

Border:None

再次编译,运行程序,效果如下:

现在的对话框背景已经和我们设想的基本一致,还有一点小瑕疵,大家仔细观察对话框的底边,左下角和右下角有多于的像素,下面我们通过代码消除它。

在OnInitDialog尾部追加如下代码:

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

通过以上的代码可以让对话框变成一个圆角矩形,这样就可以去掉边角的点,程序最终运行效果如下:

现在这个对话框的背景已经完全符合我们的要求,但是它现在不能拖动,因为它的标题栏是假的,所以,我们最后一个目标就是让这个窗口可以拖动,如何才能让它移动呢?

Windows只允许我们拖动对话框的标题栏,当我们的鼠标在对话框上拖动的时候,对话框会收到一个WM_NCHITTEST消息,默认的消息处理函数会判断当前的鼠标是否在对话框的标题栏,如果在就返回HTCAPTION标志,否则就返回其它标志,当返回HTCAPTION标志的情况下,系统就会允许对话框拖动,所以我们可以欺骗windows系统,让WM_NCHITTEST的响应函数永远返回HTCAPTION标志就可以了,为对话框添加WM_NCHITTEST响应函数,代码如下:

LRESULT CMFCDialogUIDlg::OnNcHitTest(CPoint point)
{// TODO:  在此添加消息处理程序代码和/或调用默认值LRESULT ret = CDialogEx::OnNcHitTest(point);return (ret == HTCLIENT) ? HTCAPTION : ret;
}

重新编译代码,现在的对话框背景已经美化完成,并且这个对话框可以拖动。

下篇文章,我们会为这个对话框添加美化的按钮。

用MFC做漂亮界面之美化对话框相关推荐

  1. 用MFC做漂亮界面之登录界面

    转自:https://blog.csdn.net/u011711997/article/details/79375710 前段时间由于工作原因,一直没有更新博客,今天,继续讲解如何用MFC做漂亮界面, ...

  2. Java Swing 漂亮界面beautyeye_lnf美化包的使用

    Java Swing 漂亮界面beautyeye_lnf美化包的使用 在刚刚开始学Swing时,总觉得Swing做出来的页面太难看了,但是又无可奈何,但现在好了,有了beautyeye_lnf.jar ...

  3. java如何美化按钮_MFC实现漂亮界面之美化按钮

    上次我们学习了如何美化对话框的界面,这次我们为上次的对话框添加两个按钮,一个是关闭按钮,另一个是最小化按钮,好,现在我们先看一下效果: 是不是很难看,因为我们的对话框美化了,所以我们的按钮也要美化,因 ...

  4. MFC软件欢迎界面(基于对话框,VS2013)

    话不多说先上效果图:示例Demo下载: Step1:首先你需要一张BMP格式的图片,这个工作可以在Photoshop中完成. Step2:然后我们新建一个mfc工程文件(基于对话框的) Step3:进 ...

  5. mfc制作登录界面mysql_MFC制作漂亮界面之登录界面

    [实例简介] MFC制作漂亮界面之登录界面的源码,主要使用前面学过的内容来实践一个完整的界面. [实例截图] [核心代码] LoginTigger └── LoginTigger ├── LoginT ...

  6. MFC真的过时了吗?C++是否真的适合做GUI界面?

    1.前言   这几天在论坛看到一个有趣的问题:新人入职公司做C++开发,发现公司用的界面GUI还是微软古老的MFC框架,想问大家MFC是不是已经过时了?是否还有深入学习的必要? 其实,个人觉得在讨论这 ...

  7. MFC中在界面上添加背景图片的方法

    在利用MFC做界面监控软件时,常常需要放一个漂亮的背景图片,本文基于VS2010版本,利用MFC自带的onPaint函数添加背景图片.步骤如下: 1.准备一张BMP格式的图片文件,将其保存在项目文件夹 ...

  8. python能做界面吗_如何使用pyQT做pythonGUI界面|

    如何使用pyQT做pythonGUI界面| python3 gui教程2020-09-24 23:12:27人已围观 python开发的gui漂亮吗 可以 0.前言 有不学者会问,Python 写的程 ...

  9. vs2019 MFC实现office界面的画图小项目(超超级详细)

    这是针对于博客vs2019安装和使用教程(详细)的MFC实现office界面的画图小项目的新建示例 目录 一.创建项目 二.进入多个文档的控件界面 三.编写画图小程序(先从画矩形开始) 四.我们还可以 ...

最新文章

  1. Firefox 66正式向广告宣战!预设禁止自动播放影片并加入加入 Windows Hello
  2. Bzoj 1046: [HAOI2007]上升序列 二分,递推
  3. Kuebernetes之DaemonSet
  4. 【MFC】工具栏按钮多选效果本
  5. metric learning -- 马氏距离与欧氏距离
  6. 课堂笔记——Ubiquitous Computing
  7. java三目运算符简化代码_如何使用传播运算符简化代码
  8. python3.6找到不_sqlite3模块
  9. Scrapy爬虫抓取ZOL手机详情
  10. 检测是否安装了 .NET Framework 3.5
  11. win10计算机怎么改中文,win10系统中文语言的设置方法
  12. 毕业一周年--IT在路上
  13. Java游戏用户登录注册_用java类模拟游戏的账号的登陆,注册,退出。 1.没有账号,需要注册。 2.注册完成后方可登...
  14. 经典风险因子模型 对于中国股票市场定价解释能力初探
  15. UI设计之【android 仿微信、QQ聊天,带表情,可翻页,带翻页拖动缓冲】
  16. CSS3动画特效详解
  17. IPv6 地址数量有多少,能够分配到地球上的每一粒尘埃吗
  18. Mybatis01_基础详细入门案例
  19. 省市区三级联动查询(含地区表sql)
  20. [生存志] 第127节 子午行流注

热门文章

  1. 2021世界人工智能大会
  2. 金融应用:信用卡号的合法性验证
  3. 如何解决‘CommandNotFoundError: Your shell has not been properly configured to use ‘conda activate’错误
  4. 从MySQL Bug#67718浅谈B+树索引的分裂优化
  5. 山东大学软件学院众智科学与网络化产业(网络、群体与市场)复习笔记
  6. 3、(三)外汇学习基础篇之银行间外汇即期交易
  7. 新手小白怎样玩转短视频抖音吸粉公众号小说项目
  8. C++ 定义学生信息结构体,按照学号顺序排序
  9. Kubernetes:通过轻量化工具 kubespy 实时观察YAML资源变更
  10. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 5