http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
0 @4 e" t0 G3 g/ k7 _" n
6 G9 g, @1 ]+ P
) H4 Z0 V0 y5 V% l- W在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
; G! r) J) _2 R4 F
8 w+ d% ^* w, _9 U% F函数GetTextMetrics声明如下:2 ~3 W- D0 s+ o! k* u9 Q
/ l2 r, P" U# P) V( f9 b/ t#ifndef NOTEXTMETRIC: ?; x0 y5 \' S: R) W7 ]! o
% g4 k! W% i% N* J8 V! o5 l
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
e0 q2 I; g0 DWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);9 {: Q: b$ L) B2 q5 G/ ? C
#ifdef UNICODE2 O* \ A. t$ P0 U$ w9 x2 S
#define GetTextMetrics GetTextMetricsW
9 ]8 C/ M7 w) N) o#else
8 r/ X: r- Y: x& u) ]# z#define GetTextMetrics GetTextMetricsA
" v/ J& _6 _( j+ V#endif // !UNICODE
( c( t: B+ c9 L7 [
. \5 Z0 @3 \! C( x6 \hdc是当前设备的句柄。- X: s4 i! H [
lptm是获取当前字体属性的保存结构。它的结构定义如下:
5 B8 p# z; x5 ]- Rtypedef struct tagTEXTMETRICW
" A: T" S1 k% D2 [* u- U1 N {
. t+ B* P# M! Q" G LONG tmHeight;) v( J0 ~$ m. z2 k
LONG tmAscent;
; o4 }! G$ `2 p) Q LONG tmDescent;$ e& Z5 x9 w1 `% G$ O, \. U
LONG tmInternalLeading;
4 ]9 N( m; m5 q$ B5 g' F, e LONG tmExternalLeading;* j$ |8 e5 T; z8 N% M. V8 L! S9 o
LONG tmAveCharWidth;
7 O" T. l8 N4 g$ ?4 W. v LONG tmMaxCharWidth;; L2 n( d3 }+ P5 D$ ?' f: s( X8 W' N8 d
LONG tmWeight;
' s$ p0 o: A( e* k+ V% D LONG tmOverhang;% R& P7 Z: [$ H6 C* o8 g) b, u
LONG tmDigitizedAspectX;1 U9 T6 Y& s9 j4 ~3 f# h/ P
LONG tmDigitizedAspectY;
) i B- ~) N2 Y+ s' P* e E$ v8 y WCHAR tmFirstChar;" x O9 \/ r( L+ d/ y
WCHAR tmLastChar;
5 H" s- N' j9 \# l3 [ WCHAR tmDefaultChar;
4 G" X% c5 H5 i6 Z! f, L, z WCHAR tmBreakChar;$ J7 s) c' `8 R7 j
BYTE tmItalic;. D* g4 ~& |/ `; i; g. C/ `
BYTE tmUnderlined;
: o/ }) J0 U, u, B8 l BYTE tmStruckOut;: e J) T& o+ E: d' P
BYTE tmPitchAndFamily;
9 Z5 h% H+ T! f0 Y5 a BYTE tmCharSet;
. [* h& \3 n) g1 e } TEXTMETRICW;
7 z" P, T+ }7 [4 M8 B$ V
# I5 ~) O0 q" T) r调用这个函数的例子如下:- V U- J5 |! [7 V- ]9 }8 R
#001 //$ v9 G- p6 o1 p# K9 n3 i- G
#002 //界面显示输出.
# O8 [- D. W9 M- Y( I. ]( ~+ P3 z#003 //
/ K8 C [ a% G8 | I#004 //蔡军生 2007/09/06 QQ:9073204 深圳3 E( J5 O6 }% i
#005 //& z$ B# q2 P2 \& {+ @" U6 l
#006 void CCaiWinMsg::OnDraw(HDC hDC)
6 y0 ?. y$ b# m, j#007 {3 ?' e! s, v. ^8 u
#008 //
+ p4 p; ]4 j+ o8 k#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
+ R& o- A' ?; X/ R. E# S' g& u#010
( n/ u% {; g- {% Q#011 //设置输出字符串的颜色.3 y! j4 y0 h3 [2 k y
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));5 b- ]1 b" g D- }
#013
3 {6 [8 S' @0 B! H& w# p#014 RECT rcText; / ]8 G3 a1 t/ m$ U: p, e
#015 : C* P3 T5 n1 Z: q/ x9 H) R
#016 //设置新字体.* m7 b1 y* h3 g$ m& \5 C( x" e
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());; @# Q. J. @4 W# s6 D. h
#018
1 V" ]' ~( \& [' ~#019 //获取当前字体的高度.
3 y' u3 Q9 L- Z# C9 ]0 I9 T#020 TEXTMETRIC tmFont;4 l q$ O- R! L. u$ ], O
#021 if (GetTextMetrics(hDC,&tmFont))
4 [9 N. h1 J1 U! S2 ~( z, j. U9 n* ^#022 {
8 x. ?6 P# b* z: b( { @! n$ U$ ] u#023 rcText.left = 10;7 c3 N% A# [" |5 j; Y4 ?. D; ^$ B
#024 rcText.top = 40;% |4 p% d6 }1 o, H6 g
#025 rcText.right = 300;
7 q' A8 I- h' g0 P; O#026 rcText.bottom = rcText.top + tmFont.tmHeight; % E, X7 d& W6 m9 _( n4 a
#027 }
1 Z9 ?& f0 V1 l#028 else Q+ X& H+ I: }& N$ ~
#029 {
4 ?" F+ u0 R4 c1 V* r( O#030 rcText.left = 10;" y, T0 \. D4 f# g* T
#031 rcText.top = 40;
2 U; A) \9 T8 K5 c, T% O( k$ b#032 rcText.right = 300;
7 W, N# J! I. m) q#033 rcText.bottom = 80;
6 X5 \5 w0 q& @# ?3 J#034 }
! e! j0 s/ f$ u, B- `9 i1 W#035
) z) ^8 I( u2 b, L5 S6 Q: Z# b#036 //创建黑色的画刷,$ [+ d2 W3 P5 V9 i1 d
#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
8 z4 C6 I0 t" H7 K1 f#038
& s$ s, U' ?6 r7 @#039 //用黑色的画刷填充四边形的颜色.2 i: E6 A1 B# \+ r
#040 FillRect(hDC,&rcText,hbrush);; e n2 x9 g8 O; w/ y/ R: J
#041 2 t( H- B3 J0 D! l7 r8 G
#042 //删除画刷., ~! k( W' W, I# K, r
#043 DeleteObject(hbrush);
6 L" \) t3 d6 N3 h#044
& w! q9 Q" s1 Y5 e! i#045 //设置透明背景9 O( E- \8 O6 [4 p; k0 n; w5 x
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);) d9 e( Y/ Y/ ?& g& O3 X
#047
1 r) D8 ]. [( U3 J#048 //显示字符串在四边形的中间位置.
% w. p; J% J6 n#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,8 C4 r8 {# u8 g8 z
#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
( U4 f1 y3 {% p+ _0 D! C#051 ' M; K: s/ u! r
#052 //恢复原来的字体.8 I* o8 B5 \3 ]9 F
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);" D8 v# ~* x& P/ x; a$ i
#054 DeleteObject(hFont);
4 r; D5 V% t9 h0 u& K9 _#055
6 D$ f& R; v5 v- z) i) G, ~#056 //恢复原来的模式.0 y& r k+ B; u! L' t$ P
#057 SetBkMode(hDC,nOldMode);1 H) L1 B% y- Y% B. v" B
#058 $ I! K' z1 V# {! d. l6 i" A) X4 `
#059 //恢复原来的颜色.% Z. m( D2 K" ?% `, q
#060 SetTextColor(hDC,crOld);4 X8 z h, s1 U* g2 v) k0 h
#061 }
. z' D5 {0 B! A#062 |