網站首頁 編程語言 正文
介紹
什么叫做復選框?
復選框是一種可同時選中多項的基礎控件,主要是有兩種明顯的狀態:選中與非選中。
在我們實際開發過程中,單純的系統邊框已經無法滿足對界面顯示需求了,這時需要采用自定義圖片進行展示,那么展示效果是如何呢?
對于我們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
相關推薦
- 2022-09-17 詳解python中靜態方法staticmethod用法_python
- 2022-10-23 Android用于加載xml的LayoutInflater源碼超詳細分析_Android
- 2022-04-15 ASP.NET?Core托管模型CreateDefaultBuilder()方法_基礎應用
- 2022-01-03 Table表格怎么無限添加內容
- 2022-06-19 Python?matplotlib實現條形統計圖_python
- 2023-02-14 Python實現完全數的示例詳解_python
- 2022-11-18 教你用正則表達式提取數字和小數點_正則表達式
- 2022-02-12 Cognos Sample for Oracle數據源
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支