MFC中Edit控制元件垂直滾動條時,當文字超出時再顯示垂直滾動條
阿新 • • 發佈:2018-11-08
現在我需要實現這樣一個功能:
想要用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控制元件上顯示的是畫素寬度。目前我是沒有解決這個問題。如果我解決了,會更新給大家。哈