MFC修改編輯框光標(biāo)顯示位置方法詳解
當(dāng)前的開發(fā)環(huán)境:VS2010,32位 MFC框架
使用MFC中系統(tǒng)CComboBox控件時,會有三種風(fēng)格,其中有一種風(fēng)格:CBN_DROPDWON,該編輯框是可以進行編輯的。
更改多CComboBox高度的友友們就會發(fā)現(xiàn)這樣一個問題,控件高度變高后,edit編輯控件的高度光標(biāo)一直處于左上角的位置,看起來很是不美觀,如下圖所示:
其實,想要實現(xiàn)光標(biāo)處于垂直狀態(tài),如下圖所示:
這種效果看著就比較順眼了,此時,有人想要問,怎么改變編輯框的高度呢?
有人使用系統(tǒng)的MoveWindow,居然不生效?這個問題我也遇到過。具體為什么不生效,我無法解釋,但是我知道如何改變edit編輯框的高度
SetItemHeight(-1 , 60); --- >>>>設(shè)置edit編輯框的高度 === 60
SetItemHeight(1 , 60); ---- >>>>設(shè)置下拉文本的高度 === 60
如果有需要可以使用兩句代碼進行設(shè)置。
下面,就要說說如何改變edit光標(biāo)的位置。
第一種方案
我最開始打算在 PreSubclassWindow 消息中,將我自己繪制的MyEdit 與CCombobx控件中的編輯控件進行關(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)的位置進行改變。
對OnNcCalcSize函數(shù)的解析:
第一步:
獲取當(dāng)前自繪類中,設(shè)置的字體的屬性。
在獲取的時候,有可能lf.lfHeight為負數(shù)。所以,這里我使用了三目運算符進行轉(zhuǎn)換。如果是負數(shù),轉(zhuǎn)成正數(shù)。
第二步:
獲取當(dāng)前控件的所有屬性。
根據(jù)上一步獲取的字體的高度,移動關(guān)聯(lián)上edit控件。這里的m_editCtrl控件的關(guān)聯(lián),和我的列出的第一種方案的關(guān)聯(lián)是一樣的。
根據(jù)上述代碼,可以實現(xiàn)的效果,如下:
實現(xiàn)的效果居然如上圖所示,和我展示的效果有些不同,有一塊不明確區(qū)域。
后來我想著在該控件的顏色反射消息中獲取,是不是在OnNcCalcSize中改變了edit區(qū)域后,以后的都變了?
經(jīng)過測試后,發(fā)現(xiàn)。edit的區(qū)域沒有改變,但是這一塊陰影是怎么來的?我很是不明白。
后來,恍然大悟!因為我修改了edit的顯示區(qū)域,但是系統(tǒng)認為還是原來的區(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); }
再次運行,就沒有陰影區(qū)域了。如此就設(shè)置成功了。
到此這篇關(guān)于MFC修改編輯框光標(biāo)顯示位置方法詳解的文章就介紹到這了,更多相關(guān)MFC修改編輯框光標(biāo)位置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟詳解
這篇文章主要介紹了C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02