MFC修改編輯框光標顯示位置方法詳解
當前的開發(fā)環(huán)境:VS2010,32位 MFC框架
使用MFC中系統(tǒng)CComboBox控件時,會有三種風格,其中有一種風格:CBN_DROPDWON,該編輯框是可以進行編輯的。
更改多CComboBox高度的友友們就會發(fā)現(xiàn)這樣一個問題,控件高度變高后,edit編輯控件的高度光標一直處于左上角的位置,看起來很是不美觀,如下圖所示:

其實,想要實現(xiàn)光標處于垂直狀態(tài),如下圖所示:

這種效果看著就比較順眼了,此時,有人想要問,怎么改變編輯框的高度呢?
有人使用系統(tǒng)的MoveWindow,居然不生效?這個問題我也遇到過。具體為什么不生效,我無法解釋,但是我知道如何改變edit編輯框的高度
SetItemHeight(-1 , 60); --- >>>>設(shè)置edit編輯框的高度 === 60
SetItemHeight(1 , 60); ---- >>>>設(shè)置下拉文本的高度 === 60
如果有需要可以使用兩句代碼進行設(shè)置。
下面,就要說說如何改變edit光標的位置。
第一種方案
我最開始打算在 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),不能修改光標的位置。
該方案準備放棄。
第二種方案
后來,我看別的博友說使用 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ù)上述我貼出的代碼可以將光標的位置進行改變。
對OnNcCalcSize函數(shù)的解析:
第一步:
獲取當前自繪類中,設(shè)置的字體的屬性。
在獲取的時候,有可能lf.lfHeight為負數(shù)。所以,這里我使用了三目運算符進行轉(zhuǎn)換。如果是負數(shù),轉(zhuǎn)成正數(shù)。
第二步:
獲取當前控件的所有屬性。
根據(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修改編輯框光標顯示位置方法詳解的文章就介紹到這了,更多相關(guān)MFC修改編輯框光標位置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟詳解
這篇文章主要介紹了C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-02-02

