1. 程式人生 > >MFC中Edit控制元件垂直滾動條時,當文字超出時再顯示垂直滾動條

MFC中Edit控制元件垂直滾動條時,當文字超出時再顯示垂直滾動條

現在我需要實現這樣一個功能:

     想要用edit控制元件本身的滾動條,並且設定該屬性,但是該滾動條會一直存在。效果如下圖,很是難看,當沒有輸入資訊時,也會出現垂直滾動條

其實,只有在文字超過設定的區域內才會顯示(在這我不知道如何上傳動態效果圖片,所以只有程式碼展示了)

第一步:對於控制元件屬性的設定

Multiline = True

Auto HScroll = False

Auto VScroll = True

Vertical Scroll = True

第二步:重寫PreSubclassWindow()這個函式

virtual void PreSubclassWindow();
void CMyEdit::PreSubclassWindow()
{
	//如果使用者設定了  垂直滾動條  ,隱藏屬性,只有超出時才會顯示
	if(GetStyle() & WM_VSCROLL)
	{
		this->ShowScrollBar(SB_VERT , FALSE);
	}
	CEdit::PreSubclassWindow();
}

第三步:重寫OnKeyUp訊息。

因為當用戶按下鍵盤時,才會輸入內容,根據輸入的行數判斷是否超出控制元件的高度,才會觸發滾動條訊息

CStringW   StrLog;
//第一步:獲取文字的行數
int nLineCount = GetLineCount();
//獲取字型的高度、寬度
CFont  *font = this->GetFont();
LOGFONT lf;
font->GetLogFont(&lf);
int TextHeight = lf.lfHeight;
TextHeight < 0 ? -TextHeight : TextHeight;

//獲取控制元件自身的高度、寬度
CRect   rectEdit;
this->GetRect(rectEdit);
int  editHeight = rectEdit.Height();

//當輸入的高度 > 控制元件高度   觸發滾動條
if (editHeight < TextHeight*nLineCount)
{
	this->ShowScrollBar(SB_VERT , TRUE);
}
else
	this->ShowScrollBar(SB_VERT , FALSE);

這樣子就設定好了。

我曾嘗試要設定水平滾動條。但是 ,我發現了一個問題,我獲取到了字串總體的寬度與edit控制元件的寬度不在一個層面上。就是說,我獲取的是物理寬度,但是edit控制元件上顯示的是畫素寬度。目前我是沒有解決這個問題。如果我解決了,會更新給大家。哈