复选框是一种可同时选中多项的基础控件,主要是有两种明显的状态:选中与非选中。本文将通过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中的绘制,以及刷新问题。
以上就是基于MFC实现自定义复选框效果的详细内容,更多关于MFC自定义复选框的资料请关注编程学习网其它相关文章!
本文标题为:基于MFC实现自定义复选框效果


基础教程推荐
- 详解c# Emit技术 2023-03-25
- C语言 structural body结构体详解用法 2022-12-06
- C语言基础全局变量与局部变量教程详解 2022-12-31
- C++中的atoi 函数简介 2023-01-05
- 一文带你了解C++中的字符替换方法 2023-07-20
- C利用语言实现数据结构之队列 2022-11-22
- C++详细实现完整图书管理功能 2023-04-04
- C++使用easyX库实现三星环绕效果流程详解 2023-06-26
- C/C++编程中const的使用详解 2023-03-26
- 如何C++使用模板特化功能 2023-03-05