欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MFC修改編輯框光標(biāo)顯示位置方法詳解

 更新時間:2022年02月22日 10:27:43   作者:中國好公民st  
這篇文章主要介紹了在MFC中利用CComboBox控件修改編輯框光標(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ù)組指針的簡要說明

    C語言中二維數(shù)組指針的簡要說明

    這篇文章主要介紹了C語言中二維數(shù)組指針的簡要說明,文章后也附送一個小練習(xí)題進行鞏固,需要的朋友可以參考下
    2015-08-08
  • C++中為什么要使用動態(tài)內(nèi)存

    C++中為什么要使用動態(tài)內(nèi)存

    大家好,本篇文章主要講的是C++中為什么要使用動態(tài)內(nèi)存,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C語言系列之推箱子游戲

    C語言系列之推箱子游戲

    這篇文章主要為大家詳細介紹了C語言系列之推箱子游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺談mwArray和一般數(shù)組的區(qū)別

    淺談mwArray和一般數(shù)組的區(qū)別

    下面小編就為大家?guī)硪黄獪\談mwArray和一般數(shù)組的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++ 動態(tài)內(nèi)存管理詳情解說

    C++ 動態(tài)內(nèi)存管理詳情解說

    這篇文章主要介紹了C++ 動態(tài)內(nèi)存管理詳情解說,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-07-07
  • C++從文件中提取英文單詞的實現(xiàn)方法

    C++從文件中提取英文單詞的實現(xiàn)方法

    本文主要介紹了C++從文件中提取英文單詞的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C++內(nèi)存池兩種方案解析

    C++內(nèi)存池兩種方案解析

    這篇文章主要詳情介紹了C++內(nèi)存池兩種方案做對比,對此感興趣的小伙伴一起來看看吧
    2021-08-08
  • Reactor反應(yīng)器的實現(xiàn)方法詳解

    Reactor反應(yīng)器的實現(xiàn)方法詳解

    本篇文章是對Reactor反應(yīng)器的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++變量存儲的生命周期與作用域?qū)嵗a精講

    C++變量存儲的生命周期與作用域?qū)嵗a精講

    這篇文章主要介紹了C++變量存儲的生命周期與作用域,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細講講,感興趣的可以學(xué)習(xí)一下
    2022-10-10
  • C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟詳解

    C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟詳解

    這篇文章主要介紹了C語言指針變量作為函數(shù)參數(shù)的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02

最新評論