基于MFC实现自定义复选框效果
作者:中国好公民st
介绍
什么叫做复选框?
复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中。
在我们实际开发过程中,单纯的系统边框已经无法满足对界面显示需求了,这时需要采用自定义图片进行展示,那么展示效果是如何呢?
对于我们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自定义复选框的资料请关注脚本之家其它相关文章!