http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
6 L' J; h# \& U+ e4 C k8 Y8 ^" D* }5 S# m
" N, b+ j$ T: X) J+ t
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。# i* K+ i6 C" a2 O" b
$ I( h: L# Q+ ]6 }# f函数GetTextMetrics声明如下:7 R' ^# `8 ?0 k; Q' T* X
6 O3 W& K, x( v% r A) o' G% q P#ifndef NOTEXTMETRIC
0 Z6 n- i% b. E& _* g9 K W
0 P; g6 S+ e$ b0 o% B. E! tWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
7 a9 J) _: I0 N5 v LWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);+ J! o7 s: ]7 z
#ifdef UNICODE
0 N) D+ _$ O D" u5 \( J2 U7 ^#define GetTextMetrics GetTextMetricsW
$ i" m) \2 w! W( e: t9 c% K#else
1 ?5 g! Q! E( v& B. T+ V#define GetTextMetrics GetTextMetricsA
* X3 s- H6 [9 R g6 [" `5 N- U#endif // !UNICODE8 ?4 t: H- K4 K) t7 w r! h
+ k$ m8 [4 A' B5 ~
hdc是当前设备的句柄。
! l: z y4 S( z% j, xlptm是获取当前字体属性的保存结构。它的结构定义如下:* d( e4 |* v+ H& ]' T
typedef struct tagTEXTMETRICW: n2 N/ c! |/ n' H8 y
{: y- _' A0 ^2 d6 O# ~
LONG tmHeight;
3 X5 ^! P& D N' ]8 q/ ?2 K6 B( C LONG tmAscent;9 N1 A; Q5 a5 e# z- ~' S" ]
LONG tmDescent;
! w) U' T5 L& e3 h8 w LONG tmInternalLeading;3 n% _2 {0 u8 J' @; J: R
LONG tmExternalLeading;
) F: G7 T) M/ C2 s: {/ m LONG tmAveCharWidth;
8 ] a% g0 T( c( e+ B) g8 w9 J LONG tmMaxCharWidth;/ `) h. j# p# r9 a Y4 \
LONG tmWeight;9 }* P: c/ j' K! ]
LONG tmOverhang;
$ w" V! Y1 C% Q+ p LONG tmDigitizedAspectX;
9 f1 s9 {% {; R1 M& o# G# O+ e0 F LONG tmDigitizedAspectY;( j% E/ m+ T$ n) G5 M
WCHAR tmFirstChar;- [# M% f8 J* h4 c' ~3 r. \" v8 x
WCHAR tmLastChar;
7 e) b d+ j2 O0 G3 c WCHAR tmDefaultChar;) n8 k! `0 m O0 P5 @3 a
WCHAR tmBreakChar;8 O3 E) S. O) {* L! e% F3 B( M8 Q
BYTE tmItalic;4 L9 ?! [7 W, q8 M* z1 W4 C
BYTE tmUnderlined;
! A( p7 W( y, |$ L- | BYTE tmStruckOut;/ P7 S. d" M" F" ]) @
BYTE tmPitchAndFamily;$ o0 G# q/ H! _, n3 c
BYTE tmCharSet;
/ m2 Y v9 j" r! ?: \- M } TEXTMETRICW;2 c& i# W( S/ ^( I3 K
1 y. A3 x0 H. G! d/ ^
调用这个函数的例子如下:6 s; B1 R! X2 j: E; s
#001 //
' }+ U; ~+ c& p) G3 X#002 //界面显示输出.
6 L4 E$ g6 Q4 ?0 ~8 z9 [#003 //7 I/ y9 d5 k" B& M4 V
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
' y1 c4 d" F j, o$ D1 ], ]: i#005 //; E/ A* _ ~5 ]# q
#006 void CCaiWinMsg::OnDraw(HDC hDC)
) M3 K& ?7 p) R3 P#007 {
) c& [3 J. g; @9 G#008 //
7 q- W3 @2 w- w#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));& j- _# X- m/ M6 w" L$ _8 |3 j3 O
#010
4 _& p& }- q. r' B( g7 v#011 //设置输出字符串的颜色./ ?+ m% V6 z' S* ]
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));' P3 y% J5 ^6 P
#013
# Q% o- y0 G8 U0 [! @#014 RECT rcText; 8 r; `! M( ] \' F
#015
! n' F1 v- q3 G% b+ P#016 //设置新字体.
# r" O7 j1 A2 P! D#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
% k. {: K/ V; K$ X6 C#018
; P/ j2 p) k2 E9 i3 d: |#019 //获取当前字体的高度.
# ^+ N& h) ^5 s3 a& J2 q#020 TEXTMETRIC tmFont;
* S; T, R! s+ \#021 if (GetTextMetrics(hDC,&tmFont))
& a3 I4 N( a5 x' |' Z. Z3 K#022 {! L, @! e. K+ e, I
#023 rcText.left = 10;
3 d0 `. v2 O2 T0 c#024 rcText.top = 40;
/ V& y8 Z* D# c#025 rcText.right = 300;
+ g o4 K2 Q" O& o O9 T& V; s#026 rcText.bottom = rcText.top + tmFont.tmHeight; 7 g/ G1 r: J3 V1 o
#027 }
5 C" q* C1 t' Q! \#028 else; x' I9 X. B- @" F5 |
#029 {7 B" O- g7 x5 K
#030 rcText.left = 10;% c( t5 N# ~) r! T' a
#031 rcText.top = 40;7 j# i3 I6 E. l; E \- d5 P
#032 rcText.right = 300;, q: c& @# C' R
#033 rcText.bottom = 80;
& \1 w2 `" T0 k6 C2 A#034 }( {2 h n, k7 ` x+ I- u* m
#035
/ f d" c# `# X4 O#036 //创建黑色的画刷,& D- Z3 [( q2 f7 u* P" G# a% `
#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));$ ]* b6 p6 h) k7 L; m
#038
( E* P6 e- i$ ^* {8 V#039 //用黑色的画刷填充四边形的颜色.5 E$ R; B( x) ^ c' s. H: S* k
#040 FillRect(hDC,&rcText,hbrush);
) j- C# o% g# ^: k( ]1 h#041
2 l. Z& {' T: k0 e- P' o#042 //删除画刷. r2 N1 W& M# K4 P9 v) X: I
#043 DeleteObject(hbrush);
/ H3 K0 C! ?1 R- r/ P! o# H- e#044 , a3 |. n2 g* b0 O ]
#045 //设置透明背景
. E6 P0 I4 ^3 t1 P- y#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
3 g" N5 q0 n& }9 B#047
+ m' g! x* W3 W8 k% U#048 //显示字符串在四边形的中间位置.
2 j$ N' P9 w- G1 D& ?#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,* V* X5 @" B( L2 Q& E+ Q
#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);$ B1 P/ n* Q6 u6 G
#051
' Z. l+ r+ ]/ Z9 d/ \0 A# s/ z+ [#052 //恢复原来的字体.
# X( K+ `. G9 {9 m2 }% I#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
K7 Q# u6 [' ]( k: K% _+ ]3 [#054 DeleteObject(hFont);/ ^+ f$ ~/ A7 e6 r' \
#055 8 k1 i% U7 }, L8 S* b! v
#056 //恢复原来的模式.# t: d9 T0 F1 B; g4 d$ F
#057 SetBkMode(hDC,nOldMode);, f' {5 f5 P: S, c% S3 H
#058
3 f6 Y/ W6 c2 E4 z/ Q; I# H#059 //恢复原来的颜色./ M" `8 G4 g% r
#060 SetTextColor(hDC,crOld);
' q* W l7 v0 S4 S# X9 v: G S( m#061 }* j% \& P4 H1 }( F1 [0 o9 d
#062 |