Windows API一日一練(30)GetTextMetrics函數

來源:互聯網
上載者:User
在做報表裡,經常要把輸出的內容進行錯落有致的排列,讓使用者看起來更加舒服。比如使用標題的字型輸出後,再使用其小號的字型進行輸出。這樣就需要知道每種字型的高度,才讓兩行文字輸出不重疊在一起,就需要計算每種字型的高度。這時就需使用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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.