写点什么

MFC|实现自定义复选框效果

  • 2022 年 9 月 26 日
    河北
  • 本文字数:1205 字

    阅读完需:约 4 分钟

MFC|实现自定义复选框效果

什么叫做复选框?

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


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

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

功能实现

复选框父类:CButton

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

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

继承后的类框架是:

class UICustomCheck : public CButton {	DECLARE_DYNAMIC(UICustomCheck)public:	UICustomCheck();	virtual ~UICustomCheck();protected:	DECLARE_MESSAGE_MAP()};
复制代码

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

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

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

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

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 值的数据。所以说,这里用到了函数重写功能

void  SetCheck(int nCheck);
复制代码


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

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

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

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

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 中的绘制,以及刷新问题。


我是中国好公民 st,一名 C++开发程序猿~

发布于: 刚刚阅读数: 2
用户头像

书山有路勤为径,学海无涯苦作舟 2022.07.01 加入

擅长语言:C++ 涉及语言:Python

评论

发布
暂无评论
MFC|实现自定义复选框效果_c++_中国好公民st_InfoQ写作社区