MFC修改編輯框光標(biāo)顯示位置方法詳解
當(dāng)前的開發(fā)環(huán)境:VS2010,32位 MFC框架
使用MFC中系統(tǒng)CComboBox控件時(shí),會(huì)有三種風(fēng)格,其中有一種風(fēng)格:CBN_DROPDWON,該編輯框是可以進(jìn)行編輯的。
更改多CComboBox高度的友友們就會(huì)發(fā)現(xiàn)這樣一個(gè)問題,控件高度變高后,edit編輯控件的高度光標(biāo)一直處于左上角的位置,看起來很是不美觀,如下圖所示:
其實(shí),想要實(shí)現(xiàn)光標(biāo)處于垂直狀態(tài),如下圖所示:
這種效果看著就比較順眼了,此時(shí),有人想要問,怎么改變編輯框的高度呢?
有人使用系統(tǒng)的MoveWindow,居然不生效?這個(gè)問題我也遇到過。具體為什么不生效,我無法解釋,但是我知道如何改變edit編輯框的高度
SetItemHeight(-1 , 60); --- >>>>設(shè)置edit編輯框的高度 === 60
SetItemHeight(1 , 60); ---- >>>>設(shè)置下拉文本的高度 === 60
如果有需要可以使用兩句代碼進(jìn)行設(shè)置。
下面,就要說說如何改變edit光標(biāo)的位置。
第一種方案
我最開始打算在 PreSubclassWindow 消息中,將我自己繪制的MyEdit 與CCombobx控件中的編輯控件進(jìn)行關(guān)聯(lián),希望可以用
CEdit::SetRectNP修改Edit控件的顯示區(qū)域。
代碼如下,主要是做關(guān)聯(lián)
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函數(shù)獲取。
獲取到的edit的區(qū)域 comboInfo.rcItem。
再使用m_editCtrl.SetRectNP(處理后的edit區(qū)域)。
結(jié)果發(fā)現(xiàn),不能修改光標(biāo)的位置。
該方案準(zhǔn)備放棄。
第二種方案
后來,我看別的博友說使用 OnNcCalcSize 消息做處理。在這里處理edit區(qū)域設(shè)置。
我就嘗試著使用該消息
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); }
這里面包含了消息聲明、定義以及具體的應(yīng)用。
根據(jù)上述我貼出的代碼可以將光標(biāo)的位置進(jìn)行改變。
對(duì)OnNcCalcSize函數(shù)的解析:
第一步:
獲取當(dāng)前自繪類中,設(shè)置的字體的屬性。
在獲取的時(shí)候,有可能lf.lfHeight為負(fù)數(shù)。所以,這里我使用了三目運(yùn)算符進(jìn)行轉(zhuǎn)換。如果是負(fù)數(shù),轉(zhuǎn)成正數(shù)。
第二步:
獲取當(dāng)前控件的所有屬性。
根據(jù)上一步獲取的字體的高度,移動(dòng)關(guān)聯(lián)上edit控件。這里的m_editCtrl控件的關(guān)聯(lián),和我的列出的第一種方案的關(guān)聯(lián)是一樣的。
根據(jù)上述代碼,可以實(shí)現(xiàn)的效果,如下:
實(shí)現(xiàn)的效果居然如上圖所示,和我展示的效果有些不同,有一塊不明確區(qū)域。
后來我想著在該控件的顏色反射消息中獲取,是不是在OnNcCalcSize中改變了edit區(qū)域后,以后的都變了?
經(jīng)過測(cè)試后,發(fā)現(xiàn)。edit的區(qū)域沒有改變,但是這一塊陰影是怎么來的?我很是不明白。
后來,恍然大悟!因?yàn)槲倚薷牧薳dit的顯示區(qū)域,但是系統(tǒng)認(rèn)為還是原來的區(qū)域。所有上面的內(nèi)容就呈現(xiàn)為CCombobox的非客戶區(qū)域。
我需要刷新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); }
再次運(yùn)行,就沒有陰影區(qū)域了。如此就設(shè)置成功了。
到此這篇關(guān)于MFC修改編輯框光標(biāo)顯示位置方法詳解的文章就介紹到這了,更多相關(guān)MFC修改編輯框光標(biāo)位置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中二維數(shù)組指針的簡(jiǎn)要說明
這篇文章主要介紹了C語(yǔ)言中二維數(shù)組指針的簡(jiǎn)要說明,文章后也附送一個(gè)小練習(xí)題進(jìn)行鞏固,需要的朋友可以參考下2015-08-08C++中為什么要使用動(dòng)態(tài)內(nèi)存
大家好,本篇文章主要講的是C++中為什么要使用動(dòng)態(tài)內(nèi)存,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02C++ 動(dòng)態(tài)內(nèi)存管理詳情解說
這篇文章主要介紹了C++ 動(dòng)態(tài)內(nèi)存管理詳情解說,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-07-07Reactor反應(yīng)器的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)Reactor反應(yīng)器的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++變量存儲(chǔ)的生命周期與作用域?qū)嵗a精講
這篇文章主要介紹了C++變量存儲(chǔ)的生命周期與作用域,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下2022-10-10C語(yǔ)言指針變量作為函數(shù)參數(shù)的實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了C語(yǔ)言指針變量作為函數(shù)參數(shù)的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02