NX二次开发-MFC对话框自己重绘Button控件(提升美观度)重写DrawItem方法(已完结)
作者:互联网
- 文章讨论主题
MFC控件的重绘
在做NX二次开发的时候,我们有时会用到MFC对话框,去做界面,但是 MFC界面很丑(毕竟是上个世纪90年代的东西了,已经被时代抛弃了),所以导致很多人不愿意用。
面对界面丑的问题,我们可以自己重绘界面,重绘控件。来解决这个问题。
- 原始的普普通通,丑的button控件风格,展示
- 1.自己写代码重绘button控件
1.首先新建一个MFC界面的NX二次开发项目,不会的请看这篇 NX二次开发-基于MFC界面对话框与NX交互的开发
2.有两种方式-- 1.是直接在当前的界面上 重绘当前button按钮。2. 是自己新建一个类,基类是CButton,自己重绘封装一个button控件
先讲第一种方法:
1.先在界面上拖一个button控件过来,然后双击进去,为按钮添加一个事件,随便写个messagebox弹窗就行了。这个简单,就不详细写了。
void CFirstMFCDialog::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 AfxMessageBox("sb"); }
2.点控件-右键属性,更改 Owner Draw 为 True,允许自绘
对话框-右键属性,添加 WM_DRAWITEM 消息
在OnDrawItem回调函数里,通过代码绘制来 重绘我们的控件
void CFirstMFCDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //获得控件的CDC CDC *pdc = CDC::FromHandle(lpDrawItemStruct->hDC); //获得控件的区域 CRect rect = lpDrawItemStruct->rcItem; //设置画刷 CBrush brush; //设置一个画笔 CPen pen; //设置字体 CFont font; CString title = "大煞笔"; //文字的尺寸 CSize sz; //按钮自绘 if (nIDCtl == IDC_BUTTON1) { //用画笔设置控件边框 pen.CreatePen(PS_SOLID, 3, RGB(0, 255, 0)); //创建一个实心画刷 brush.CreateSolidBrush(RGB(255, 0, 0));//红色 //更改字体 font.CreateFont(20, 0, 0, 0, 0, NULL, NULL, NULL, DEFAULT_CHARSET, 0, 0, 0, 0, "华文彩云"); pdc->SelectObject(font); pdc->SelectObject(pen); pdc->SelectObject(brush); //绘制一个长方形 pdc->Rectangle(rect); //获得文字的长*高 尺寸 sz = pdc->GetTextExtent(title); //换算位置,设置居中 rect.top += (rect.Height() - sz.cy) / 2; //将文字背景设为透明的 pdc->SetBkMode(TRANSPARENT); //显示字符串 pdc->DrawText(title, rect, DT_CENTER); //释放 font.DeleteObject(); pen.DeleteObject(); brush.DeleteObject(); pdc->DeleteDC(); } CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct); }
演示
在讲第二种方法
先在项目里,添加一个类
取一个类名,然后添加基类
项目会加两个文件过来
点击类的属性
重写 DrawItem方法
去掉这个函数 上的默认注释
然后往里面添加代码
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 //获得控件的CDC CDC *pdc = CDC::FromHandle(lpDrawItemStruct->hDC); //获得控件的区域 CRect rect = lpDrawItemStruct->rcItem; //设置画刷 CBrush brush; //设置一个画笔 CPen pen; //设置字体 CFont font; CString title = "大煞笔"; //文字的尺寸 CSize sz; //按钮自绘 //用画笔设置控件边框 pen.CreatePen(PS_SOLID, 3, RGB(0, 255, 0)); //创建一个实心画刷 brush.CreateSolidBrush(RGB(255, 0, 0));//红色 //更改字体 font.CreateFont(20, 0, 0, 0, 0, NULL, NULL, NULL, DEFAULT_CHARSET, 0, 0, 0, 0, "华文彩云"); pdc->SelectObject(font); pdc->SelectObject(pen); pdc->SelectObject(brush); //绘制一个长方形 pdc->Rectangle(rect); //获得文字的长*高 尺寸 sz = pdc->GetTextExtent(title); //换算位置,设置居中 rect.top += (rect.Height() - sz.cy) / 2; //将文字背景设为透明的 pdc->SetBkMode(TRANSPARENT); //显示字符串 pdc->DrawText(title, rect, DT_CENTER); //释放 font.DeleteObject(); pen.DeleteObject(); brush.DeleteObject(); pdc->DeleteDC(); }
到这里,我们的封装函数 就弄完了,
下面是如何使用。
在MFC界面上 重新拖一个Button控件过来,然后绑定变量,更改 Owner Draw 为 True,允许自绘
添加头文件,替换 上面控件变量的CButton类为CMyButton类
编译运行
这个hpp 和 cpp就是我们自己封装好的控件重绘类了,以后直接加在别的项目上调用就行了,
参考资料 MFC按钮自绘 https://www.bilibili.com/video/BV1Av411J7rn/?spm_id_from=333.788.recommend_more_video.3
MFC应用程序自绘之窗口背景的美化(一) https://www.bilibili.com/video/BV1TD4y1D7p5/?spm_id_from=333.788.recommend_more_video.0
不知道怎么调用,请看下面的文章内容。
演示
- 2.去codeproject网站上下载开源控件类,调用别人封装好的代码
登录进来之后,去搜索框里搜button,因为是国外网站所以搜索很慢,还有建议用QQ浏览器去用,谷歌和火狐浏览器好像有的时候显示有问题,还有 要自己注册个账户 ,为后面下载用。
搜出来的一堆中,样式有很多,代码有VC的 也有 .net的,这里我们选择 VC的来下载。
点击去 https://www.codeproject.com/Articles/67/Round-Buttons-2
有关代码介绍,和下载的 Demo和源代码 点下面。
下载下来结果如下
不知道怎么使用就去看,它的demo例子。
知道怎么使用,就直接拿src里面 封装好的hpp 和 cpp
- 在我们的NX二次开发项目里,调用 开源控件
1.在界面上在重新拖一个button控件过来
2.为控件绑定一个变量
自己把这个按钮拖大一点
更改控件属性,Owner Draw改成 True,表示 使用重绘控件
3.把网上下的开源控件代码hpp 和 cpp加到我们的项目中来
把#include "RoundButton.h" 头文件加上
编译项目,报错了,
错误问题是atan2函数少头文件,自己把#include <cmath> 头文件加上就好了,编译通过
4.将CRoundButton类 与 我们的button控件就行绑定
去对话框的头文件里面找到m_btn这个变量,然后将它前面的CButton类改成CRoundButton类
CRoundButton也是继承CButton的,是别人重绘封装的控件。 class CRoundButton : public CButton
换完之后,编译项目,然后去NX里面执行。
大功告成
演示
这样一来,无论用MFC做什么样的界面,想要好看美观,那么去重绘就可以了。
自己还需要重绘哪些控件,就去codeproject找,如果没有满足需求的,太个性化的,就自己去写代码重绘。
更多内容
https://www.codeproject.com/Articles/2674/Store-and-show-Tree-struct-in-a-Combobox
阿飞
2022年4月19日
标签:控件,MFC,界面,对话框,二次开发,pdc,重绘,rect 来源: https://www.cnblogs.com/nxopen2018/p/16164513.html