其他分享
首页 > 其他分享> > NX二次开发-MFC对话框自己重绘Button控件(提升美观度)重写DrawItem方法(已完结)

NX二次开发-MFC对话框自己重绘Button控件(提升美观度)重写DrawItem方法(已完结)

作者:互联网

MFC控件的重绘

在做NX二次开发的时候,我们有时会用到MFC对话框,去做界面,但是 MFC界面很丑(毕竟是上个世纪90年代的东西了,已经被时代抛弃了),所以导致很多人不愿意用。

面对界面丑的问题,我们可以自己重绘界面,重绘控件。来解决这个问题。

 

 

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

不知道怎么调用,请看下面的文章内容。

演示

 

https://www.codeproject.com/

登录进来之后,去搜索框里搜button,因为是国外网站所以搜索很慢,还有建议用QQ浏览器去用,谷歌和火狐浏览器好像有的时候显示有问题,还有 要自己注册个账户 ,为后面下载用。

 

 

搜出来的一堆中,样式有很多,代码有VC的 也有 .net的,这里我们选择 VC的来下载。

 

 点击去   https://www.codeproject.com/Articles/67/Round-Buttons-2

有关代码介绍,和下载的 Demo和源代码 点下面。

 

 下载下来结果如下

 

 不知道怎么使用就去看,它的demo例子。

知道怎么使用,就直接拿src里面 封装好的hpp 和 cpp

 

 

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