当前位置:主页 > 软件编程 > C代码 >

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

时间:2022-10-31 10:16:36 | 栏目:C代码 | 点击:

介绍

什么叫做复选框?

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

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

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

您可能感兴趣的文章:

相关文章