ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-04-23 18:33:02  阅读:483  来源: 互联网

标签:控件 MFC 界面 对话框 二次开发 pdc 重绘 rect


  • 文章讨论主题

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网站上下载开源控件类,调用别人封装好的代码

https://www.codeproject.com/

登录进来之后,去搜索框里搜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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有