http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
. k: _+ T$ }- k* w$ G B% Y2 H* k, }$ r- N; @5 [' R! O
1 L, ^: _8 F8 ^" K: S% V! j! `在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。# j% \; _, a: Y; J' H+ A( t
2 ]+ e4 [+ {/ `/ h# L8 R) \2 \ ~4 S函数GetTextMetrics声明如下:+ p( S" e$ s4 R2 s- U9 t
/ Y/ V" ]7 a, F; `. [& e# ^
#ifndef NOTEXTMETRIC
3 G0 D! |0 R2 t1 I
6 Y, r& h+ \" f, ?WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);$ L8 f) L. Z, r( ~( T0 @7 z4 \. M
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
2 D# j- h, S/ B# w#ifdef UNICODE$ n- ?6 P V' f8 ~) H2 c. F
#define GetTextMetrics GetTextMetricsW( q" }6 @ X/ I: D
#else
- K c! _* T, h4 `* e& l6 L( I9 C#define GetTextMetrics GetTextMetricsA
4 q6 n. \( |8 d! y3 S#endif // !UNICODE
) F3 M5 A* r3 N- b4 K* E1 q ( O U, |/ j# K0 R- P
hdc是当前设备的句柄。
8 C+ d7 o2 _1 \* s8 n% Olptm是获取当前字体属性的保存结构。它的结构定义如下:- {9 p/ g8 c: C" n6 T
typedef struct tagTEXTMETRICW
4 I4 r) W$ [" D. w* [' R2 i7 m, p3 s {9 w) N1 [$ n e9 a6 K
LONG tmHeight;8 z/ ^) f3 |6 X9 `3 f, K# d1 `
LONG tmAscent;+ o& v& O/ V8 O( w
LONG tmDescent;8 E# x( ^+ v( u$ _- i1 ~1 u
LONG tmInternalLeading;
# q* v! P' w0 U# J) a& X7 n LONG tmExternalLeading;
, _+ s3 b1 B1 |# L% i LONG tmAveCharWidth;. d* E: P/ F# M% j" K
LONG tmMaxCharWidth;
& L! D% G4 H9 A1 I: J2 a! p5 d LONG tmWeight;6 C- s F; N! U' Z9 J
LONG tmOverhang;
n8 x0 Q6 e' b& t, r7 I$ s LONG tmDigitizedAspectX;( ^; @: h6 D* a! P
LONG tmDigitizedAspectY;! ^: \; y6 O/ E8 A9 r" U
WCHAR tmFirstChar;
/ l' ^+ m5 ]$ f" u: l WCHAR tmLastChar;: u+ L7 _ T7 D
WCHAR tmDefaultChar;
+ V' G' L0 g( W2 K WCHAR tmBreakChar;4 n* ^, o8 r! @ ?3 q
BYTE tmItalic;+ ?$ O1 z: l" P" q
BYTE tmUnderlined;
; f9 R7 W, [ @# D/ c1 n BYTE tmStruckOut;
0 [$ L4 ^0 z w, e8 ? BYTE tmPitchAndFamily;- O" V1 J1 M( M: s
BYTE tmCharSet;
! k8 U9 x- V3 y5 a- ]% E } TEXTMETRICW;/ X- T! _0 R+ a$ V6 z
2 n/ @) ?. Q/ b2 p1 ?& e
调用这个函数的例子如下:' Q( F" l ^% r, p( s1 j
#001 //; ~ f! A( Q& z4 d. k& ]) m
#002 //界面显示输出.: Q: j" Q& D! Q" w& k$ P0 H
#003 // v) k7 {+ ]- |! d
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
% Q8 m* B7 ?' D9 U" O) E7 S#005 //5 _: a" s% Z4 {7 E
#006 void CCaiWinMsg::OnDraw(HDC hDC)
7 P+ Z- Y: J$ D' y6 O#007 {. ?9 _! g: D, `) ]& i
#008 //
) c3 V2 i# [6 K7 O% j4 y#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
0 z0 {. D3 B& L! b+ S+ D1 u#010 2 C7 N. I7 g6 `0 F1 a
#011 //设置输出字符串的颜色.& O9 G2 s5 |: {3 K o3 H) [% \
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));* Z6 Y3 E/ ^( P _' ^8 X
#013 ; b: |3 n7 l3 ]1 X6 Z- o2 B, l
#014 RECT rcText;
( e5 @5 ?* Q; i$ L#015
& s2 l8 a) W0 k#016 //设置新字体.
: S$ H: _5 F, p) H2 z#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());. Z6 M& P8 h: I; v! b# q, ]5 m
#018
7 d# c5 r1 {% s7 @3 c' a1 u#019 //获取当前字体的高度.! K W* u5 x% t7 C" B" c
#020 TEXTMETRIC tmFont;% q. v$ v4 u. f7 G) s. i
#021 if (GetTextMetrics(hDC,&tmFont)), k) w5 `* q* s8 S: u/ f) k
#022 {9 y: h1 B F# W! U* G
#023 rcText.left = 10;+ L6 n# k& Y( X
#024 rcText.top = 40;6 U) `8 I- C/ h2 h7 J6 L' a0 U
#025 rcText.right = 300;
) z' }, K9 Y* B _( @' w#026 rcText.bottom = rcText.top + tmFont.tmHeight; 5 D: X1 l/ ?' g7 z a
#027 }, A/ _* Z( N# {' S, A$ P
#028 else
; ^+ ], a* X1 p" b" |#029 {
% w" X. _. b" O" O8 b8 B#030 rcText.left = 10;3 q: \( q* k- p% w
#031 rcText.top = 40;
$ Z( g6 Z& p1 o/ x#032 rcText.right = 300;! s) F9 C& i9 f; Z- U9 `
#033 rcText.bottom = 80;/ U9 m+ s1 D& L( h
#034 }; I' e1 V/ J) v# g( Z- ]
#035
: A0 Z6 R0 t% t" \' R#036 //创建黑色的画刷,
# R8 D0 r3 [- m! F' J#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
% U- v+ N& e0 v' H' b#038
( R+ ^; @3 [# }#039 //用黑色的画刷填充四边形的颜色.
! c+ B" {& d5 p. [( `. X. j% W#040 FillRect(hDC,&rcText,hbrush);
4 J( [9 X6 G4 h+ e0 B7 J9 l: z#041 4 X6 k! g1 G5 j0 ^: t% {& @+ l. x
#042 //删除画刷.- S+ b$ E9 d$ m. j3 h
#043 DeleteObject(hbrush);
2 B/ g) N/ M' r: ?0 J7 |0 R& E4 I5 x#044 , M' p" a5 L+ V" P# i- u& X: p; ~
#045 //设置透明背景( p! j }& E- B7 `/ ]9 D: X
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);$ q3 Q) a/ k3 ]3 m
#047
+ ^7 K0 m$ n& e3 r: e' g. _#048 //显示字符串在四边形的中间位置.# F( Q: @' A; M3 k) Q* n- A
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
0 e4 w- ?: @. @9 l# p& v& c5 o. e#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);+ R) O+ |5 w5 O2 K
#051
$ K3 B+ G2 ~7 F/ t+ P#052 //恢复原来的字体.
$ A" z8 \: w4 Y4 g#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);/ l$ y$ l1 \9 U: a. Y
#054 DeleteObject(hFont);
. w$ d) y% ]( h& h7 K0 L# g#055 & V9 r/ d' [+ J5 F
#056 //恢复原来的模式.# Y2 ]1 O8 E5 l5 v2 z# C
#057 SetBkMode(hDC,nOldMode);
" s+ F X1 O* \( g3 c' W8 Y, k#058 - Q7 Y7 W0 W3 I8 ]1 L
#059 //恢复原来的颜色.
7 r" P8 j' O. k#060 SetTextColor(hDC,crOld);
6 s6 y E" ~" M& q3 {) a#061 }
6 ~% x( ]- B& S, P#062 |