網站首頁 編程語言 正文
當前的開發環境:VS2010,32位 MFC框架
使用MFC中系統CComboBox控件時,會有三種風格,其中有一種風格:CBN_DROPDWON,該編輯框是可以進行編輯的。
更改多CComboBox高度的友友們就會發現這樣一個問題,控件高度變高后,edit編輯控件的高度光標一直處于左上角的位置,看起來很是不美觀,如下圖所示:
其實,想要實現光標處于垂直狀態,如下圖所示:
這種效果看著就比較順眼了,此時,有人想要問,怎么改變編輯框的高度呢?
有人使用系統的MoveWindow,居然不生效?這個問題我也遇到過。具體為什么不生效,我無法解釋,但是我知道如何改變edit編輯框的高度
SetItemHeight(-1 , 60); ?--- >>>>設置edit編輯框的高度 === 60
SetItemHeight(1 , 60); ? ---- >>>>設置下拉文本的高度 === 60
如果有需要可以使用兩句代碼進行設置。
下面,就要說說如何改變edit光標的位置。
第一種方案
我最開始打算在 PreSubclassWindow?消息中,將我自己繪制的MyEdit?與CCombobx控件中的編輯控件進行關聯,希望可以用
CEdit::SetRectNP修改Edit控件的顯示區域。
代碼如下,主要是做關聯
void MyComboBox::PreSubclassWindow() { CComboBox::PreSubclassWindow(); COMBOBOXINFO comboInfo; //獲取控件信息 comboInfo.cbSize = sizeof(COMBOBOXINFO); GetComboBoxInfo(&comboInfo); //子類化編輯框 if (comboInfo.hwndItem != nullptr ) { if ( !((GetStyle() & CBS_DROPDOWNLIST) == CBS_DROPDOWNLIST)) m_editCtrl.SubclassWindow(comboInfo.hwndItem); } }
其中,主要用到的是GetComboBoxInfo函數獲取。
獲取到的edit的區域 comboInfo.rcItem。
再使用m_editCtrl.SetRectNP(處理后的edit區域)。
結果發現,不能修改光標的位置。
該方案準備放棄。
第二種方案
后來,我看別的博友說使用 OnNcCalcSize 消息做處理。在這里處理edit區域設置。
我就嘗試著使用該消息
afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp); BEGIN_MESSAGE_MAP(MyComboBox, CComboBox) ON_WM_NCCALCSIZE() END_MESSAGE_MAP() void MyComboBox::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp) { //獲取字體的屬性 CFont *font = GetFont(); LOGFONT lf; font->GetLogFont(&lf); LONG nFontHeight = 0; nFontHeight = lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight; COMBOBOXINFO comboInfo; //獲取控件信息 comboInfo.cbSize = sizeof(COMBOBOXINFO); GetComboBoxInfo(&comboInfo); CRect rectEdit = comboInfo.rcItem; rectEdit.top += (rectEdit.Height()-nFontHeight)/2 -3; m_editCtrl.MoveWindow(rectEdit); CComboBox::OnNcCalcSize(bCalcValidRects , lpncsp); }
這里面包含了消息聲明、定義以及具體的應用。
根據上述我貼出的代碼可以將光標的位置進行改變。
對OnNcCalcSize函數的解析:
第一步:
獲取當前自繪類中,設置的字體的屬性。
在獲取的時候,有可能lf.lfHeight為負數。所以,這里我使用了三目運算符進行轉換。如果是負數,轉成正數。
第二步:
獲取當前控件的所有屬性。
根據上一步獲取的字體的高度,移動關聯上edit控件。這里的m_editCtrl控件的關聯,和我的列出的第一種方案的關聯是一樣的。
根據上述代碼,可以實現的效果,如下:
實現的效果居然如上圖所示,和我展示的效果有些不同,有一塊不明確區域。
后來我想著在該控件的顏色反射消息中獲取,是不是在OnNcCalcSize中改變了edit區域后,以后的都變了?
經過測試后,發現。edit的區域沒有改變,但是這一塊陰影是怎么來的?我很是不明白。
后來,恍然大悟!因為我修改了edit的顯示區域,但是系統認為還是原來的區域。所有上面的內容就呈現為CCombobox的非客戶區域。
我需要刷新combobox的背景
afx_msg BOOL OnEraseBkgnd(CDC *pDC); BEGIN_MESSAGE_MAP(MyComboBox, CComboBox) ON_WM_ERASEBKGND() END_MESSAGE_MAP() BOOL MyComboBox::OnEraseBkgnd(CDC *pDC) { CRect rect; GetClientRect(rect); pDC->FillSolidRect(&rect , RGB(255 , 255 , 255)); return FALSE; //return CComboBox::OnEraseBkgnd(pDC); }
再次運行,就沒有陰影區域了。如此就設置成功了。
原文鏈接:https://juejin.cn/post/7067318498111782926
相關推薦
- 2022-06-20 基于python?的Pygame最小開發框架_python
- 2022-05-29 .NET中的字符串駐留池介紹_基礎應用
- 2022-09-08 C++實現Dijkstra算法的示例代碼_C 語言
- 2022-08-29 C#中Attribute特性的用法_C#教程
- 2022-07-03 python編碼格式導致csv讀取錯誤問題(csv.reader,?pandas.csv_read)
- 2022-11-07 python一招完美搞定Chromedriver的自動更新問題_python
- 2022-12-16 C++?Boost?Atomic詳細講解_C 語言
- 2022-06-02 C語言基于EasyX庫實現有圖形界面鐘表_C 語言
- 最近更新
-
- 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同步修改后的遠程分支