在做報表裡,經常要把輸出的內容進行錯落有致的排列,讓使用者看起來更加舒服。比如使用標題的字型輸出後,再使用其小號的字型進行輸出。這樣就需要知道每種字型的高度,才讓兩行文字輸出不重疊在一起,就需要計算每種字型的高度。這時就需使用GetTextMetrics函數來擷取字型的高度。
函數GetTextMetrics聲明如下:
#ifndef NOTEXTMETRIC
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
#ifdef UNICODE
#define GetTextMetrics GetTextMetricsW
#else
#define GetTextMetrics GetTextMetricsA
#endif // !UNICODE
hdc是當前裝置的控制代碼。
lptm是擷取當前字型屬性的儲存結構。它的結構定義如下:
typedef struct tagTEXTMETRICW
{
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
WCHAR tmFirstChar;
WCHAR tmLastChar;
WCHAR tmDefaultChar;
WCHAR tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRICW;
調用這個函數的例子如下:
#001 //
#002 //介面顯示輸出.
#003 //
#004 //蔡軍生 2007/09/06 QQ:9073204 深圳
#005 //
#006 void CCaiWinMsg::OnDraw(HDC hDC)
#007 {
#008 //
#009 std::wstring strShow(_T("C++視窗類別的實現,2007-09-04"));
#010
#011 //設定輸出字串的顏色.
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
#013
#014 RECT rcText;
#015
#016 //設定新字型.
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
#018
#019 //擷取當前字型的高度.
#020 TEXTMETRIC tmFont;
#021 if (GetTextMetrics(hDC,&tmFont))
#022 {
#023 rcText.left = 10;
#024 rcText.top = 40;
#025 rcText.right = 300;
#026 rcText.bottom = rcText.top + tmFont.tmHeight;
#027 }
#028 else
#029 {
#030 rcText.left = 10;
#031 rcText.top = 40;
#032 rcText.right = 300;
#033 rcText.bottom = 80;
#034 }
#035
#036 //建立黑色的畫刷,
#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
#038
#039 //用黑色的畫刷填充四邊形的顏色.
#040 FillRect(hDC,&rcText,hbrush);
#041
#042 //刪除畫刷.
#043 DeleteObject(hbrush);
#044
#045 //設定透明背景
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
#047
#048 //顯示字串在四邊形的中間位置.
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
#051
#052 //恢複原來的字型.
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
#054 DeleteObject(hFont);
#055
#056 //恢複原來的模式.
#057 SetBkMode(hDC,nOldMode);
#058
#059 //恢複原來的顏色.
#060 SetTextColor(hDC,crOld);
#061 }
#062