服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 基于MFC实现自定义复选框效果

基于MFC实现自定义复选框效果

2022-09-15 18:12中国好公民st C/C++

复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中。本文将通过MFC框架实现自定义复选框效果,感兴趣的可以了解一下

介绍

什么叫做复选框?

复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中。

在我们实际开发过程中,单纯的系统边框已经无法满足对界面显示需求了,这时需要采用自定义图片进行展示,那么展示效果是如何呢?

基于MFC实现自定义复选框效果

对于我们MFC框架来说,想要实现一个自定义的控件很难,一般情况下采用自绘的方式实现。对于Check控件来说,也是如此。

功能实现

复选框父类:CButton

当我们从资源视图中拖出来一个控件并绑定成员变量后,当前复选框的父类便是CButton。

这里,假设自绘的复选框类名称叫做:UICustomCheck

继承后的类框架是:

?
1
2
3
4
5
6
7
8
9
class UICustomCheck : public CButton
{
    DECLARE_DYNAMIC(UICustomCheck)
public:
    UICustomCheck();
    virtual ~UICustomCheck();
protected:
    DECLARE_MESSAGE_MAP()
};

前几章我也曾经说过,MFC中控件的自绘无外乎两种情况:OnPaint自绘以及DrawItem自绘。

针对于复选框控件来说,是需要在OnPaint自绘的。

思路:根据选中的两种状态,分别显示不同的图片。

第一种情况(未选中状态),展示未选中状态图片;第二种情况(选中状态),展示选中状态图片

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CPaintDC  dc(this);
CRect   rcClient;
this->GetClientRect(&rcClient);
 
//绘制按钮的状态显示
if(m_bState == 0) //未按下
{
    if (!m_ImageUnCheck.IsNull())
    {
        m_ImageUnCheck.Draw(dc.GetSafeHdc() ,rcClient);
    }
}
else{ //按下
    if (!m_ImageCheck.IsNull())
    {
        m_ImageCheck.Draw(dc.GetSafeHdc() , rcClient);
    }
}

代码讲解:

m_bState是一个bool值变量,0:未选中状态;1:选中状态

当用户设置状态更换时,此时需要更新m_bState值的数据。所以说,这里用到了函数重写功能

?
1
void    SetCheck(int nCheck);

该函数是属于CButton的内部函数,为了在用户设置选中状态时更新图片,此时,就需要重写该函数。

还有一种情况,用户不手动设置SetCheck函数改变状态,只是点击控件,自动更新状态,那么该如何实现呢?

在我们自绘过程中,每个自绘控件都会有鼠标的点击消息,为了实现多次点击更换图片的状态,一般都会使用OnLButtonDown或者是OnLButtonUp两个消息进行设置。

这里,我是重写的OnLButtonUp消息,鼠标抬起后更新显示状态

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void UICustomCheck::OnLButtonUp(UINT nFlags, CPoint point)
{
    m_bState = !m_bState;
    if (this->m_hWnd != nullptr)
    {
        CWnd *pParent = this->GetParent();
        CRect rc;
        this->GetWindowRect(rc);
        pParent->ScreenToClient(rc);
        pParent->InvalidateRect(rc, TRUE);
        pParent->UpdateWindow();
    }
    this->Invalidate(FALSE);
    CButton::OnLButtonUp(nFlags , point);
}

代码讲解:

每次更换图片时,不确定用户使用的是否是异形图片,所以,在更换状态时都需要获取父窗口中当前控件对应的区域,进行强制刷新。

到这里,复选框的图片替换功能就讲解结束了,功能简单,主要是在OnPaint中的绘制,以及刷新问题。

以上就是基于MFC实现自定义复选框效果的详细内容,更多关于MFC自定义复选框的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7062225299919863822

延伸 · 阅读

精彩推荐
  • C/C++简单好用的C语言偏门知识,复合文字,编程小知识值得拥有

    简单好用的C语言偏门知识,复合文字,编程小知识值得拥有

    本文主要介绍一些C语言的一些偏门知识给大家,在这里简单谈一下C语言复合文字。需要读者具备一定的C语言基础。...

    C语言基础10372021-03-10
  • C/C++C语言通讯录实例分享

    C语言通讯录实例分享

    这篇文章主要为大家分享了C语言通讯录实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    StevenLoveMaggie5092021-06-20
  • C/C++C++读写配置项的基本操作

    C++读写配置项的基本操作

    这篇文章主要介绍了C++读写配置项的基本操作,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下...

    李道臣9642021-10-18
  • C/C++C++二分法在数组中查找关键字的方法

    C++二分法在数组中查找关键字的方法

    这篇文章主要介绍了C++二分法在数组中查找关键字的方法,涉及C++数组查找算法的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    清清飞扬11652021-03-15
  • C/C++C++字符串反转的几种方法

    C++字符串反转的几种方法

    通过不同的方法,实现对所输入字符串的反转,具有一定的参考价值,需要的朋友们下面随着小编来一起学习学习吧...

    lemaden9512021-11-19
  • C/C++C++对象模型之RTTI的实现原理

    C++对象模型之RTTI的实现原理

    RTTI是Runtime Type Identification的缩写,意思是运行时类型识别。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象...

    今日头条1692020-10-23
  • C/C++C语言基础 strlen 函数

    C语言基础 strlen 函数

    这篇文章主要介绍了C语言基础 strlen 函数,在C 语言中,char 字符串也是一种非常重要的数据类型,我们可以使用 strlen 函数获取字符串长度,这就是C语言...

    猿说编程4112022-02-16
  • C/C++浅析C语言中的sizeof

    浅析C语言中的sizeof

    sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义...

    C语言教程网2062020-12-17