日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

基于MFC實現自定義復選框效果_C 語言

作者:中國好公民st ? 更新時間: 2022-04-15 編程語言

介紹

什么叫做復選框?

復選框是一種可同時選中多項的基礎控件,主要是有兩種明顯的狀態:選中與非選中。

在我們實際開發過程中,單純的系統邊框已經無法滿足對界面顯示需求了,這時需要采用自定義圖片進行展示,那么展示效果是如何呢?

對于我們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中的繪制,以及刷新問題。

原文鏈接:https://juejin.cn/post/7062225299919863822

欄目分類
最近更新