http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
& y! Q. Q1 s4 q M0 a3 e3 ]9 ]0 T3 J2 ~; H4 Y8 F0 l
2 v, T3 ^% x" f
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
0 w* s: r6 E. B3 [; A! J' @
. z, G0 _# G7 _; }) G3 w函数GetTextMetrics声明如下:# O$ s, y) i& h& L. ?* d
# N0 h( L* A: J' V& ^# P#ifndef NOTEXTMETRIC
1 ~& q" e4 n/ J
! A) z8 S9 d ^* y; jWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
) G' P4 w; Y* \WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
4 ~6 j. w( ` [# Y# {#ifdef UNICODE
# x" @( j7 i$ `7 z# n0 a#define GetTextMetrics GetTextMetricsW
+ q: \+ B1 Q7 x8 X' y, ]) Q5 ^#else: }) {1 ^1 {- S1 L
#define GetTextMetrics GetTextMetricsA0 W- a, E8 L; X1 y i9 B
#endif // !UNICODE" F. E6 H; u! Y4 ~2 [. [- y* ]: _
6 d1 v( ^8 _% x' v# s zhdc是当前设备的句柄。
7 p+ g3 v! D+ x2 u3 `& _; {( hlptm是获取当前字体属性的保存结构。它的结构定义如下:* J4 S! n' J; N6 w- J4 I- i5 W
typedef struct tagTEXTMETRICW
7 |# Z) ^+ J. b0 {5 l {
: K) b0 O. J% t! V4 Q# e LONG tmHeight;
' X( G5 W: X& }% x3 w+ t. C LONG tmAscent;
9 |' H s$ X1 m! E LONG tmDescent;# A5 E6 m/ |/ ?1 [) f" ~
LONG tmInternalLeading;
6 T) ?; l: T) T; v LONG tmExternalLeading;
/ P& r4 [5 Z/ j2 n5 f% d' t7 s LONG tmAveCharWidth;
* v' T: L3 k5 c. m7 T9 e LONG tmMaxCharWidth;+ s- w2 U6 m( F
LONG tmWeight;! b- i: t! r q$ Z1 H# I7 R
LONG tmOverhang;1 A9 m, I* E8 M
LONG tmDigitizedAspectX;+ G+ @0 W% p9 K1 Q8 B+ R ?2 ~* H
LONG tmDigitizedAspectY;
1 ~" T5 d! A) B9 b) z WCHAR tmFirstChar;
0 |* P3 u; J3 p WCHAR tmLastChar;
" f5 j- m3 y# g2 i5 a5 S/ d6 d WCHAR tmDefaultChar;
$ S9 I% l3 n! C/ \- e1 i7 P WCHAR tmBreakChar;
) X% E) I l" X2 n% S0 @ BYTE tmItalic;
2 l7 X0 z, M! Z BYTE tmUnderlined;" P- ?) v1 B& y' m9 m
BYTE tmStruckOut;' F2 F. q7 K: R( p& P+ d8 L
BYTE tmPitchAndFamily;2 W5 `4 j$ k1 D" |0 V- g& d* n
BYTE tmCharSet;
( e. C$ G y5 d } TEXTMETRICW;; c0 _7 S+ l* k) n; X
/ b8 g) @" X" C$ Q3 G8 e# N调用这个函数的例子如下:4 {2 M3 S/ g8 n
#001 //
5 P$ ~1 L- v& U" B#002 //界面显示输出.
1 f+ H1 [0 |6 o3 `#003 //
4 M. A/ {- o: O" \2 U, ~6 v#004 //蔡军生 2007/09/06 QQ:9073204 深圳
$ a6 E: o" [, z4 [3 G1 ?3 w6 k8 w( P#005 //1 P/ Y2 L4 L) @9 E
#006 void CCaiWinMsg::OnDraw(HDC hDC)8 Y: m" e* o% ?4 h% p
#007 {
' A. O( R# A1 J. V; Y2 E#008 //
4 ^" b& o* P" x8 A+ Y1 K#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
/ v( j$ V; |9 M; n1 y; O2 A7 Z#010 / s M4 ~9 s2 u1 a# C8 v
#011 //设置输出字符串的颜色.
3 F9 R$ D# k6 e. P b/ P#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
4 c( I+ O% F Y: A#013
+ F7 n7 _- M4 R+ x- `#014 RECT rcText; . e% W: D2 M: o5 Q
#015
3 Q7 o+ I- `9 p6 o#016 //设置新字体.
1 Z/ O- j; g! G, ?1 |9 d+ O#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
% \% H; x# ~; s/ S/ v#018 % ~! ]) d9 r2 Y/ \+ P) M: S* m
#019 //获取当前字体的高度.
) z" `' i0 k9 S5 |4 O9 e3 ~#020 TEXTMETRIC tmFont;4 O) \9 M1 `3 j# |* Z- D
#021 if (GetTextMetrics(hDC,&tmFont))) h z/ W$ z; @6 O9 N. s( ?" n
#022 {" V- f4 m. m: L
#023 rcText.left = 10;
7 N. q% M' g }# y, O1 v8 R% p#024 rcText.top = 40;3 U$ t7 ]6 Q+ v1 V) Y
#025 rcText.right = 300;
* V6 [5 Y2 q# j- q! J) Y2 y& L#026 rcText.bottom = rcText.top + tmFont.tmHeight;
0 \" B# p: u$ R: f2 {#027 }. S( @& {2 |- x' I8 _+ O
#028 else
: v7 u5 e# e) ~* ]+ @7 _#029 {$ `: S6 M$ H; Q& T! [6 ]
#030 rcText.left = 10;# j* G% K! [' N6 o
#031 rcText.top = 40;
+ ~" o" S5 s! r6 O) U3 d#032 rcText.right = 300;
0 k6 a* \7 o7 @#033 rcText.bottom = 80;! p9 G8 R5 Q6 e
#034 }3 u* T( ~5 L7 g1 Y/ s
#035
+ P" l7 Z z( U: x, F#036 //创建黑色的画刷,
3 {& H. X ^3 U#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
- U& P6 ^$ K- D! \7 G# J6 }#038 # ?9 G' w1 k5 j a4 q1 S
#039 //用黑色的画刷填充四边形的颜色.
: Y1 o1 @) L; s2 u#040 FillRect(hDC,&rcText,hbrush);) X: i4 s! Q. s1 h9 a2 I$ t A
#041 7 j$ l/ R- n2 A2 E: W* f8 n
#042 //删除画刷.5 }) p' i" X/ ]8 d, T
#043 DeleteObject(hbrush);
+ I' U9 w" r7 j+ h4 D#044
6 W$ t) h- X1 F, |8 @1 U#045 //设置透明背景
6 T2 T$ m) ~8 k. y#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
/ B$ M! t1 `. m$ a5 a#047
4 f; R+ Q( N% t4 |# E5 X8 ]% E& C#048 //显示字符串在四边形的中间位置.' p5 a' ^# e4 v3 v5 a* K
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
$ @$ J# p8 P9 e v4 ~; |#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
1 O! O. x5 I+ j: [3 x#051 ( k9 t7 m" F' s" G
#052 //恢复原来的字体.
4 r% Z9 W* D7 E- d4 v#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);8 F3 d' q, E! h% [0 T
#054 DeleteObject(hFont);& F( {" v4 z4 h% G+ s# U! }& W
#055
a/ \6 ^, G7 j' k1 H( I#056 //恢复原来的模式.5 s. x, X" |4 a4 d% E
#057 SetBkMode(hDC,nOldMode);3 F9 L) }6 ^" @8 h
#058
& H! r& r$ ?& s g#059 //恢复原来的颜色.
! V V% h) x0 }" J/ K6 }% u#060 SetTextColor(hDC,crOld);
9 z7 e0 O; \6 p% B3 ~+ f4 W: \/ R#061 }
$ n' o B2 O c Q" A#062 |