自繪控制項時.經常會繪製文本.繪製文本在GDI中已經有了很好的支援.
最常用的是兩個函數:
◆ TextOut
virtual BOOL TextOut(int x ,int y ,LPCSTR lpszString ,int nCount );
BOOL TextOut(int x ,int y ,const CString& str);
這個函數功能很簡單,就是繪製一個文本串.x,y就是起始點.
預設是靠左對齊文本輸出格式.換句話說就是:如果文本很長(超過了顯示地區),那麼後面的都將會截斷.
可以使用SetTextAlign來指定文本的對齊.
重點介紹下面這個函數;
◆ DrawText:
virtual int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat);
int DrawText(const CString& str, LPRECT lpRect, UNIT nFormat);
這個函數主要提供的功能是在某個地區內繪製文本.
首先這個函數除了TextOut所能繪製的文本樣式中,增加了CRect,主要做的操作就是限定文本繪製地區.換句話說,如果文本的長度超過繪製地區,那麼它將截斷.
除此之外它還增加一個nFormat,這個標誌用來告訴系統,應該以什麼方式來繪製(靠左對齊?單行?多行?...)
我這裡重點討論的問題就是,如何將某一文本完整的繪製在某個地區內(當然這個地區一定要能包含這串文本).這裡說的不是很清楚.我們還是來看例子吧.
現在我想輸出如下所示的文本:
程式所要做的事情有以下幾點:
● 如何設定文本多行(這個比較簡單)
● 如何計算文本的寬度和高度
我們可以利用DT_LEFT|DT_WORDBREAK來使得文本靠左對齊,並且多行顯示.
現在,我們繪製的地區大小寬度是固定的.我們假設就是文本的1/3.
現在我們關鍵是第二個問題,如何計算文本的寬度和高度.我們可以有兩中方式:
1. 使用GetTextMetrics 來擷取單個字元寬度和單個字元的寬度.
2. 使用GetTextExtent 來擷取整行文本的長度和高度.
需要指出的是,前者在擷取的時候只能是平均值,這個值適合在英文狀態下的文本輸出.對中文,可能就不會準確.
後者的話,相對來說對中文的支援更好些.我們就通過它來擷取文本的高度和寬度屬性吧.
整個繪製過程如下所示:
CPaintDC dc(this); // 用於繪製的裝置上下文
CString str1= _T("如果向對話方塊添加最小化按鈕,則需要下面的代碼來繪製該表徵圖。對於使用文檔/視圖模型的 MFC 應用程式,這將由架構自動完成。");
CString str2 = _T("OnPaint");
CFont font;
font.CreateFont( 15,0,0,0,0,0,0,0,0,0,0,0,0,_T("宋體") );
CFont* pOldFont = dc.SelectObject( &font );
dc.SetBkMode( TRANSPARENT );
CSize sz = dc.GetTextExtent( str1 );
dc.DrawText( str1,CRect( 0,100,sz.cx /3,sz.cy * 3 + 100 ),DT_LEFT|DT_WORDBREAK );
dc.SelectObject( pOldFont );