1. 程式人生 > >CEdit 文字垂直居中(單行解決方案)

CEdit 文字垂直居中(單行解決方案)

關於這個問題,網上流傳的都是多行模仿,最後有附件,

由於怕細節不完美,決定探究下派生CEdit方法,可以響應WM_NCCALCSIZE訊息,關鍵程式碼如下:

void CVCenterEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
	CEdit::OnNcCalcSize(bCalcValidRects, lpncsp);

	CClientDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
	int nHeight = tm.tmHeight + tm.tmExternalLeading;

	int n = (lpncsp->rgrc[0].bottom - lpncsp->rgrc[0].top - nHeight) / 2;

 	lpncsp->rgrc[0].top += n;
 	lpncsp->rgrc[0].bottom -= n;
}

問題1,上下空白背景不是白的。

解決方案:

BOOL CVCenterEdit::OnEraseBkgnd(CDC* pDC)

繪製WindowRect會覆蓋邊框,也可以留1-2畫素讓系統畫,但根據系統不同很麻煩。

繪製ClientRect只畫文字一行,不好。

唯有把整個對話方塊背景變成白色。或者處理對話方塊的OnEraseBkgnd,但程式碼比較多,耦合大。

(經網友提示,可以在OnNcPaint裡繪製)

問題2,滑鼠到上下空白的時候,游標是箭頭而不是I,且邊框無懸浮效果。

解決方案:響應訊息WM_NCHITTEST,返回HTCLIENT。

問題3,無法觸發WM_NCCALCSIZE訊息。

解決方案:SubClass後呼叫MoveWindow等。例如BOOL CtestDlg::OnInitDialog() 中呼叫如下程式碼

m_edit.SetWindowPos(NULL,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_DRAWFRAME);

(網友的程式碼在VCenterEdit::CtlColor裡面觸發,確實很難找到一個完美的時間點觸發,

好像有個第一次顯示的訊息,懶得深究了)

-----------------------------------------------------------------------------------------------------------

附件:(多行文字模仿法)

將文字框的屬性設定為ES_MULTILINE | ES_AUTOHSCROLL且不能ES_AUTOVSCROLL | ES_WANTRETURN

http://blog.csdn.net/wincol/article/details/6198255

首先要設定為多行模式,去掉回車,滾動條等

  CRect rc;
  m_ctlSearchBox.GetClientRect(&rc);
  CDC* pDC = m_ctlSearchBox.GetDC();
  TEXTMETRIC tm;
  pDC->GetTextMetrics(&tm);
  int nFontHeight = tm.tmHeight + tm.tmExternalLeading;
  int nMargin = (rc.Height() - nFontHeight) / 2;
  rc.DeflateRect(0,nMargin);
  m_ctlSearchBox.SetRectNP(&rc);

http://topic.csdn.net/t/20030606/14/1884129.html

http://hi.baidu.com/171808966/blog/item/0aaaa36e35878bd181cb4aaa.html

http://hi.baidu.com/dcrencq/blog/item/4bdb50c215f366130ff47722.html
http://topic.csdn.net/t/20030606/14/1884129.html

http://hi.baidu.com/171808966/blog/item/0aaaa36e35878bd181cb4aaa.html

http://hi.baidu.com/dcrencq/blog/item/4bdb50c215f366130ff47722.html
http://topic.csdn.net/t/20030606/14/1884129.html

http://hi.baidu.com/171808966/blog/item/0aaaa36e35878bd181cb4aaa.html

http://hi.baidu.com/dcrencq/blog/item/4bdb50c215f366130ff47722.html