關於繪製文本詳細論述

來源:互聯網
上載者:User

自繪控制項時.經常會繪製文本.繪製文本在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 );

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.