介绍
什么叫做复选框?
复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中。
在我们实际开发过程中,单纯的系统边框已经无法满足对界面显示需求了,这时需要采用自定义图片进行展示,那么展示效果是如何呢?

对于我们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中的绘制,以及刷新问题。
以上就是基于MFC实现自定义复选框效果的详细内容,更多关于MFC自定义复选框的资料请关注w3xue其它相关文章!