冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】Windows API一日一练(30)GetTextMetrics函数 [打印本页]

作者: shane007    时间: 2009-1-20 20:48
标题: 【汉化资料】Windows API一日一练(30)GetTextMetrics函数
http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
% l: N! x1 q9 ^7 m$ o9 O7 p- ?) }) g6 _7 L! X5 g

- s- ]+ }& D+ d在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。; t) q# p* x$ p* A7 y9 ]/ ^6 a
( u1 \' u+ }7 V* ?
函数GetTextMetrics声明如下:
* P+ j* _, z/ {" x
* L0 [( J- B) L; U+ P( B#ifndef NOTEXTMETRIC/ J7 t: c) C6 G/ N$ m

) e7 u) A0 Q5 O& Z* H  j1 N% GWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);$ N0 g1 M; i- k0 X
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);$ _( d7 z" H; D
#ifdef UNICODE
2 d) I& }; j8 s0 B! o/ o% L. X#define GetTextMetrics GetTextMetricsW* \) ~7 @$ x1 {- `. t0 |4 x  i+ M
#else
+ z( n6 ~; B' J7 `) n4 F#define GetTextMetrics GetTextMetricsA
! I+ m& y$ j9 ]0 n' b#endif // !UNICODE
- U" z" d& k. ]" R   {+ h% O' [$ Q, B- [3 p
hdc是当前设备的句柄。
: e  f' l; @, ]$ @" b$ Glptm是获取当前字体属性的保存结构。它的结构定义如下:* t- `8 p" v4 Q( w( X, j) k2 @
typedef struct tagTEXTMETRICW
7 }1 ~4 G- n" w& K) Z: N    {+ H+ ]3 ]9 N9 y5 s5 ~
    LONG tmHeight;* z3 e% c0 k$ D" e$ k
    LONG tmAscent;1 a3 L; \1 Z7 K# d4 ?2 M
    LONG tmDescent;
) {3 c3 x' z5 ~9 Q+ Q- h    LONG tmInternalLeading;
8 v0 @& u1 v3 \7 i    LONG tmExternalLeading;3 g. m' [+ e, l. f6 U% y& ]! P
    LONG tmAveCharWidth;$ W' ^" f! J# [- x) t
    LONG tmMaxCharWidth;# n5 H0 d$ x3 N$ i, [. [
    LONG tmWeight;3 q5 m' ?: Q3 d$ m0 t8 M) [* X
    LONG tmOverhang;1 ^4 J2 s( ^7 t4 S8 _
    LONG tmDigitizedAspectX;# i$ ~" U# q( O. u8 u9 _2 A
    LONG tmDigitizedAspectY;
1 `3 W% {" c$ Y9 ~. K$ e    WCHAR tmFirstChar;$ ^' }% }6 K; O. b/ @, d+ q
    WCHAR tmLastChar;  e) [8 K9 ^+ X7 O. o# {7 I
    WCHAR tmDefaultChar;9 R( T2 U* W" G7 r  |! b8 \
    WCHAR tmBreakChar;$ ?- a3 C3 u, l; _
    BYTE tmItalic;
- B: U0 y7 `& k( S    BYTE tmUnderlined;
) E; ?6 R0 N1 }$ q# J9 m    BYTE tmStruckOut;
) ~2 D7 S0 [& j( p$ \% R3 Y3 }    BYTE tmPitchAndFamily;8 @  E0 t8 j6 a& e6 L+ W
    BYTE tmCharSet;
/ h5 \) ]/ u5 z8 b7 ^5 ?" z# s; Q    }     TEXTMETRICW;
5 Q+ E. u/ e2 h2 ~0 ^! g
% k6 e. g$ B. U调用这个函数的例子如下:& p2 ]# d4 D. V# ^9 ]
#001 //% P- `; y! u+ v3 a( u) B
#002 //界面显示输出.
& J+ K& U0 _1 j+ `#003 //" t: y- C  @% e' O" H
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
) o8 P; R5 [* d2 D4 `#005 //* A/ T( W$ [1 d
#006 void CCaiWinMsg::OnDraw(HDC hDC)
, D1 G! a' Q' @0 Q#007 {. K8 o) z( N  h% M5 N9 S
#008  //
9 ]( K) \) M$ g2 G& \#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
4 l( _+ ~' |' l8 x0 y, k#010  4 Z# A' Q' P; [+ S0 c% y, X
#011  //设置输出字符串的颜色.- O( k; N8 j# H1 l- _/ A
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));! q1 T9 `( l& Q9 _
#013
6 C8 ?, R  {( _#014  RECT rcText;   
+ b. E5 V/ Z$ K/ ?' I+ s#015
* h+ c$ I, G3 q, P1 Q! x#016  //设置新字体.
/ S& ~1 Q: k+ z#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());# c% Z1 b# J. B( z" K& T+ J
#018
- m: b% h* T6 }#019  //获取当前字体的高度.
' j& s) c( S9 @" _#020  TEXTMETRIC tmFont;: k6 I5 V1 y8 a: _- j- |
#021  if (GetTextMetrics(hDC,&tmFont))8 N0 x/ |$ D6 y5 J% N- L
#022  {
+ ^9 a9 M# {$ K/ R7 O#023         rcText.left = 10;
6 u$ p5 T% ]- b2 e+ x% X5 Y2 ]! L#024         rcText.top = 40;
% k8 @2 r  w( W3 [& W  Q) u#025         rcText.right = 300;# m: b- a3 E9 b# _
#026        rcText.bottom = rcText.top + tmFont.tmHeight;    0 P! w% n% i: O% F
#027  }
  b' l% y2 B- A! O% m& r#028  else. A$ Y5 s& U( f+ D" T6 ^$ m
#029  {( L9 e  Q* }2 J0 p) l2 L: J
#030         rcText.left = 10;: c" [  k/ t8 S" m  [" Y1 Q
#031         rcText.top = 40;& R! t) p6 D7 k- _
#032         rcText.right = 300;6 T. h) ~+ j2 p
#033         rcText.bottom = 80;
6 x/ Y  ~1 w" @/ M#034  }
9 M+ |7 `* X8 d3 |# T#035
, B" ^; }0 L, P#036  //创建黑色的画刷,
7 U- g  W3 |' a+ b; ?' W0 i#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
* W! T# o% \. G' X$ q, Y#038
- f/ a$ @- `7 F7 y+ F#039  //用黑色的画刷填充四边形的颜色.; a/ _4 N9 k  Y( N( {9 v
#040  FillRect(hDC,&rcText,hbrush);
9 S6 }  O5 d' j# r" D# _9 |6 f#041
* w2 `2 q$ |8 V7 d7 M#042  //删除画刷.
- L. K  N( x0 o- f& e( F7 N7 P* p! l- ^#043  DeleteObject(hbrush);: V& `1 i" [9 K1 v  a
#044         
) S4 J: x2 a9 z#045  //设置透明背景
% O0 P+ c" p. f' ]9 l) K#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
( Z; e5 H9 @# v5 o6 m#047 7 a( `9 ]8 e* K  j
#048  //显示字符串在四边形的中间位置.
7 K' _! N1 p( h#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
( O+ `( @, }. {7 g& @( M  l- N8 i#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
, B) c" N! a& x2 ~4 v4 p/ `3 _# q, S#051
3 ^  Y1 q9 T! q' M; \#052  //恢复原来的字体.
) K. C# B# |0 y3 C4 r- K#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);- f. z3 @$ J  b: l6 R
#054  DeleteObject(hFont);
! W/ |5 B' \" g#055
- q$ L! S6 a0 {1 @+ R/ l4 c7 x#056  //恢复原来的模式.3 J* Y: N; e5 N6 w2 c
#057  SetBkMode(hDC,nOldMode);4 K! ^7 H1 n2 j) |, |- P
#058 . _* i6 ?" ^- F& T* A
#059  //恢复原来的颜色.
$ Z1 G. ]8 W0 d#060  SetTextColor(hDC,crOld);0 \. \9 K& N1 E
#061 }
. C( [0 x3 N- P#062




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2