網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
介紹
什么叫做復(fù)選框?
復(fù)選框是一種可同時(shí)選中多項(xiàng)的基礎(chǔ)控件,主要是有兩種明顯的狀態(tài):選中與非選中。
在我們實(shí)際開(kāi)發(fā)過(guò)程中,單純的系統(tǒng)邊框已經(jīng)無(wú)法滿(mǎn)足對(duì)界面顯示需求了,這時(shí)需要采用自定義圖片進(jìn)行展示,那么展示效果是如何呢?
對(duì)于我們MFC框架來(lái)說(shuō),想要實(shí)現(xiàn)一個(gè)自定義的控件很難,一般情況下采用自繪的方式實(shí)現(xiàn)。對(duì)于Check控件來(lái)說(shuō),也是如此。
功能實(shí)現(xiàn)
復(fù)選框父類(lèi):CButton
當(dāng)我們從資源視圖中拖出來(lái)一個(gè)控件并綁定成員變量后,當(dāng)前復(fù)選框的父類(lèi)便是CButton。
這里,假設(shè)自繪的復(fù)選框類(lèi)名稱(chēng)叫做:UICustomCheck
繼承后的類(lèi)框架是:
class UICustomCheck : public CButton { DECLARE_DYNAMIC(UICustomCheck) public: UICustomCheck(); virtual ~UICustomCheck(); protected: DECLARE_MESSAGE_MAP() };
前幾章我也曾經(jīng)說(shuō)過(guò),MFC中控件的自繪無(wú)外乎兩種情況:OnPaint自繪以及DrawItem自繪。
針對(duì)于復(fù)選框控件來(lái)說(shuō),是需要在OnPaint自繪的。
思路:根據(jù)選中的兩種狀態(tài),分別顯示不同的圖片。
第一種情況(未選中狀態(tài)),展示未選中狀態(tài)圖片;第二種情況(選中狀態(tài)),展示選中狀態(tài)圖片
CPaintDC dc(this); CRect rcClient; this->GetClientRect(&rcClient); //繪制按鈕的狀態(tài)顯示 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是一個(gè)bool值變量,0:未選中狀態(tài);1:選中狀態(tài)
當(dāng)用戶(hù)設(shè)置狀態(tài)更換時(shí),此時(shí)需要更新m_bState值的數(shù)據(jù)。所以說(shuō),這里用到了函數(shù)重寫(xiě)功能
void SetCheck(int nCheck);
該函數(shù)是屬于CButton的內(nèi)部函數(shù),為了在用戶(hù)設(shè)置選中狀態(tài)時(shí)更新圖片,此時(shí),就需要重寫(xiě)該函數(shù)。
還有一種情況,用戶(hù)不手動(dòng)設(shè)置SetCheck函數(shù)改變狀態(tài),只是點(diǎn)擊控件,自動(dòng)更新?tīng)顟B(tài),那么該如何實(shí)現(xiàn)呢?
在我們自繪過(guò)程中,每個(gè)自繪控件都會(huì)有鼠標(biāo)的點(diǎn)擊消息,為了實(shí)現(xiàn)多次點(diǎn)擊更換圖片的狀態(tài),一般都會(huì)使用OnLButtonDown或者是OnLButtonUp兩個(gè)消息進(jìn)行設(shè)置。
這里,我是重寫(xiě)的OnLButtonUp消息,鼠標(biāo)抬起后更新顯示狀態(tài)
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); }
代碼講解:
每次更換圖片時(shí),不確定用戶(hù)使用的是否是異形圖片,所以,在更換狀態(tài)時(shí)都需要獲取父窗口中當(dāng)前控件對(duì)應(yīng)的區(qū)域,進(jìn)行強(qiáng)制刷新。
到這里,復(fù)選框的圖片替換功能就講解結(jié)束了,功能簡(jiǎn)單,主要是在OnPaint中的繪制,以及刷新問(wèn)題。
原文鏈接:https://juejin.cn/post/7062225299919863822
相關(guān)推薦
- 2022-08-05 C語(yǔ)言簡(jiǎn)明介紹指針的使用_C 語(yǔ)言
- 2024-07-15 SpringBoot使用EasyExcel導(dǎo)出Excel(含設(shè)置下拉框、表頭凍結(jié))
- 2023-08-16 uniapp中v-model數(shù)據(jù)無(wú)法讀取問(wèn)題 failed for prop “value“
- 2022-07-09 python處理excel文件之xlsxwriter?模塊_python
- 2022-04-11 用python的哈希函數(shù)對(duì)密碼加密_python
- 2022-10-07 android?studio廣播機(jī)制使用詳解_Android
- 2022-07-04 PyG搭建GCN模型實(shí)現(xiàn)節(jié)點(diǎn)分類(lèi)GCNConv參數(shù)詳解_python
- 2022-10-07 Pandas數(shù)據(jù)分析固定時(shí)間點(diǎn)和時(shí)間差_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支