http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx! K! K) F5 w! L I8 h1 Y" F
2 n2 _. u' h1 v$ X$ F$ }
2 @- Q5 V! Y, C' W3 {在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。& U% X1 s2 s* n: B( b6 O/ e9 \
/ I8 ] h7 x6 v( Z) \& C函数GetTextMetrics声明如下:
! i. @+ o+ A! r$ K4 N1 E, Y, S" I 9 r( f3 h3 `3 s& n$ ^1 y
#ifndef NOTEXTMETRIC4 \1 C# ?) Z5 W% f& S4 _" N
1 G; S- h @. C. r5 o7 U6 V, ZWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);) G" p) |- z( b* u/ A1 Y t5 ^
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);: }3 ^5 E6 m ]: _/ L
#ifdef UNICODE
# Q" }. E7 x9 P M, ~7 B5 w#define GetTextMetrics GetTextMetricsW" ~3 v& Z* v9 _2 E5 `5 y
#else0 r N+ y, v; p i9 G
#define GetTextMetrics GetTextMetricsA! Q( Q+ @( z. }7 h6 q" j
#endif // !UNICODE1 p9 O& Z+ y6 k8 U% p
* m' p W t/ b% p; C
hdc是当前设备的句柄。1 u$ P8 }/ }6 v9 R
lptm是获取当前字体属性的保存结构。它的结构定义如下:$ r2 j! ?7 ?2 P) L9 s
typedef struct tagTEXTMETRICW
# {1 E& ?5 F: @7 S {
, i3 h! B1 V& B. M9 Q LONG tmHeight;
% |: A+ U! t+ C/ J1 C9 K/ R LONG tmAscent;4 j# z8 G9 ^* D1 F8 O% P9 `
LONG tmDescent;
. M o/ i, r2 [) M% {3 o* ?0 H" |3 l LONG tmInternalLeading;4 U, b; q4 h- f2 \9 z0 K" e/ w6 l5 f
LONG tmExternalLeading;* g3 N1 S9 ]! {3 s- S
LONG tmAveCharWidth;
; O |% R+ Z0 c" ], \ LONG tmMaxCharWidth;: L; G5 Q# H3 O# D# X0 d. P; C- m
LONG tmWeight;
! a: R e* e! Z LONG tmOverhang;
\6 @9 I; U* t) }2 m LONG tmDigitizedAspectX;
! d' G; e7 Q( s# i2 n4 y LONG tmDigitizedAspectY;2 S# h- [7 `8 \( L# }% e
WCHAR tmFirstChar;" R4 b+ @9 S9 z' f+ k9 |. j
WCHAR tmLastChar;1 [2 ^( K& Q8 t( p) G+ [
WCHAR tmDefaultChar;
3 s$ B9 ?- A8 I9 Q, Q3 N8 R; U WCHAR tmBreakChar;9 e# A8 t+ k v1 x1 x: R' }
BYTE tmItalic;
K. g- G$ _" A. b! I$ Y* X BYTE tmUnderlined;
8 }5 u7 b- H9 L! H. N8 e( z BYTE tmStruckOut;# c( K7 j( p% z/ a
BYTE tmPitchAndFamily;
V- ^- Y' |4 w; W1 d/ w7 d* k BYTE tmCharSet;
. U$ K/ U i3 l+ _( m3 i# {& h } TEXTMETRICW;
4 m8 H- k- x- k; P; L
) t* F" T4 i2 {( ^, O7 F1 t) W调用这个函数的例子如下:
6 G2 g$ I+ h5 j: \- J#001 //) z- c9 G" J1 V$ y' Q0 N/ \1 v
#002 //界面显示输出. X7 Q" M4 e# S3 ?, B9 G8 S/ M2 [
#003 //) J, H( Y5 ^( Q! Y0 N; V
#004 //蔡军生 2007/09/06 QQ:9073204 深圳! L* v( U3 I n+ K; ^0 d
#005 //# p( f5 F7 n$ m$ L1 c
#006 void CCaiWinMsg::OnDraw(HDC hDC)
c5 K1 m, ]8 U: a#007 {
7 q6 Y7 I0 }% x: Q. P#008 //
5 }$ c: x# A9 E' A* l#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));4 p# k8 p0 }0 t3 n
#010 , N' s2 q3 J2 L3 m
#011 //设置输出字符串的颜色.4 c2 n3 ?. ~, f, @2 z- R, ]9 a1 Y
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));6 X) x: V3 F! x. V+ ?/ y( S
#013 / A4 W4 f2 K7 u
#014 RECT rcText;
- _- n( E) G4 Z, y- l @: K#015 # [1 X3 B6 U( }! | g
#016 //设置新字体.
9 Z1 {. }2 w. h, D#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont()); s* P9 d/ `$ l' }7 t q" f' ]2 v
#018
5 s4 P+ ~* m/ a/ E: |- x' L#019 //获取当前字体的高度.
E3 ?" y Q* B. y* c#020 TEXTMETRIC tmFont;
$ X. M F6 Y3 ]! i1 O" D; r! k: C+ e# Q) [#021 if (GetTextMetrics(hDC,&tmFont))& x/ P3 S% M# t9 W/ L
#022 {
6 |4 l8 K9 O( G. n* S! ~& o#023 rcText.left = 10;
0 H3 h0 D! ~2 ^! o9 w#024 rcText.top = 40;
% }. E8 Y- C4 I#025 rcText.right = 300;5 W/ \3 `- d2 \5 L! y' w( x
#026 rcText.bottom = rcText.top + tmFont.tmHeight; 8 d5 H" Y8 n0 [/ i+ W4 W) ]( K
#027 }
1 x+ P7 T) Y A4 v0 o7 F#028 else) D- x/ A$ F, t2 T u. G* K
#029 {
" P. a# P) n# l0 `0 C#030 rcText.left = 10;% C$ \* ^. h" }# T
#031 rcText.top = 40;
+ U9 B8 ^' V7 Z/ w#032 rcText.right = 300;
4 S0 W) q* Q: i: H2 u: c& g#033 rcText.bottom = 80;; N" o$ u7 Z. N1 \$ t9 d( G
#034 }
0 P4 e2 @! J' Y m#035 , f2 R2 D% p! \8 c& W8 v* J
#036 //创建黑色的画刷,
( k+ P: E) K% O8 r2 b: n#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
, P) E4 C5 H( o) ?( J+ \6 k#038 + ?) V$ F" ~& ^. D
#039 //用黑色的画刷填充四边形的颜色.
$ O! e1 h% B6 ^9 d#040 FillRect(hDC,&rcText,hbrush);
) r2 t1 ?3 Q8 E9 P& o#041
" T. G2 p e& G0 a2 B3 A#042 //删除画刷.
) g0 _; f( e/ y" V: ^/ |) K#043 DeleteObject(hbrush);
" Z) @4 k" s7 F/ m1 w2 a+ U$ H- Z#044
( |; a* U' E) o5 ]9 b#045 //设置透明背景9 z3 ^+ n/ I2 J1 L0 Z, ?
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
$ J& ?; w" n0 m* P; X#047
; m: a+ [5 [. m# r#048 //显示字符串在四边形的中间位置.1 G- b4 e9 u5 J; z
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
o6 D+ e: W/ p' _7 y5 M#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);3 ~5 ]/ ]5 D3 b t* r
#051 5 M* S$ N* d' q2 m
#052 //恢复原来的字体.8 @5 a2 M" _' ]) Z7 n
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);; W& h/ ?9 i+ o0 l: A- j
#054 DeleteObject(hFont);
9 d1 R) i. }) d#055
& } V; e8 Q) b' R% L#056 //恢复原来的模式.' j8 i8 V% s2 G4 K0 A, [) d
#057 SetBkMode(hDC,nOldMode);& C: I2 x9 p. Z2 I6 W" X0 o
#058
5 `4 ]5 c4 n# T; G" i1 F5 T#059 //恢复原来的颜色.
3 c% L/ M1 p9 k#060 SetTextColor(hDC,crOld);" U/ E4 y8 g5 a0 m( M- d
#061 }* i. j. }2 q! p* j
#062 |