http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx3 q3 z+ d$ {% j5 O
8 R% z* c9 a E9 x5 C2 ~
, U% ~. q# E$ S* ?+ u& d( X; k0 g) A在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
2 X0 n+ T& d' l' O/ A# { * {% O, e1 ]: }& `+ A- D: b
函数GetTextMetrics声明如下:# `9 P3 }& ~( `1 `7 m9 f
% t- n6 K$ \' L. p; Y0 W#ifndef NOTEXTMETRIC* B6 U, p0 ~2 z
/ o4 i8 W- r& K6 I* f9 M
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
: y0 g) b% o. M0 J% t( QWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);% B! i; p2 x/ H3 X* ^! t5 g
#ifdef UNICODE. u* n( E% r6 U3 l
#define GetTextMetrics GetTextMetricsW+ B% T& ~5 u3 E
#else
0 I! \& F: ^4 `$ N; C#define GetTextMetrics GetTextMetricsA1 E2 }0 d- G- c4 ]/ _
#endif // !UNICODE
7 W* R! U! t( t/ r/ S! T t, Z W/ G' S8 J5 v3 m8 N* f; G5 C& F
hdc是当前设备的句柄。% F c, B3 T' m c( L4 _5 O7 F6 @
lptm是获取当前字体属性的保存结构。它的结构定义如下:
- {0 \, o; V5 T2 Ltypedef struct tagTEXTMETRICW
7 l* ^1 e4 b6 g7 j2 R4 v4 g% P { t( `0 ?( w/ d) u+ i
LONG tmHeight;
e2 a0 Z, ^7 Q" m. B. t* I LONG tmAscent;1 ~% I6 O) v9 S% ^" d$ w3 ]
LONG tmDescent;2 b9 U) k4 V' z* _
LONG tmInternalLeading;
3 Y' Y9 w A" O& W) ^* \* t LONG tmExternalLeading;
1 q. g& E" g5 G3 b O) y2 I4 G LONG tmAveCharWidth;2 L! g; A, Y- V+ f
LONG tmMaxCharWidth;, A; m O- `7 h6 i5 z
LONG tmWeight;" J. W; O) I( q1 g$ G
LONG tmOverhang;# ~! v- J$ I# Z/ g1 v* l" w
LONG tmDigitizedAspectX;
0 l4 `3 e1 w, i5 {5 G: [ LONG tmDigitizedAspectY;9 y# i. |) W% F6 F3 w
WCHAR tmFirstChar;
+ w$ v) v7 D* p0 D WCHAR tmLastChar;. A/ D9 p O9 X/ A/ F
WCHAR tmDefaultChar;3 A" H8 s T9 L3 g! H- P% U
WCHAR tmBreakChar;; v) H& L5 b. G$ n$ L" l
BYTE tmItalic;
8 S9 p+ M& F' a0 s p BYTE tmUnderlined;
, S$ ? ?: f3 I7 L& R+ i, g& n BYTE tmStruckOut;5 C9 Y* t) y( A. v8 o
BYTE tmPitchAndFamily;- w% a ^; `# D3 h- u
BYTE tmCharSet;
& N' y4 C- K h5 t7 M) W" t) n } TEXTMETRICW;' D& u# e' U* W" v- q3 [
, T; V3 g: [6 e0 b# W# ~
调用这个函数的例子如下:
3 R7 h h" a5 r/ A8 \9 d8 G#001 //
7 m2 M; s4 r2 N& f0 q) e2 g% }#002 //界面显示输出.
" Z) D7 p9 R, Z* d1 B% `#003 //2 T& A0 y1 c) P
#004 //蔡军生 2007/09/06 QQ:9073204 深圳+ e9 c. [0 I8 c! t; X
#005 //9 z7 Q1 b3 H6 }1 A0 D8 m
#006 void CCaiWinMsg::OnDraw(HDC hDC)/ y3 l# k3 {1 E# {6 i+ Z
#007 {. N8 H7 f* Y6 i7 B
#008 //0 X5 ^# O: s9 O$ x- ]) m& w
#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));: L, F- N8 G* u/ x( a5 [/ X' p
#010 % t+ h+ G% ?9 `' B9 l) @9 L+ D/ X, w
#011 //设置输出字符串的颜色.% n @, p% O9 {% I
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
0 r8 O7 r: X& r! A' P3 ?2 ]#013 9 @+ }0 z# Z1 o% [! C, i' z7 j0 M
#014 RECT rcText; 7 g. b: ~' W8 ^4 u0 G- k
#015
6 e8 _$ f* ^3 s8 @, r3 n#016 //设置新字体.
]1 t9 Q) h! z1 _5 q#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
9 p- W* B/ c8 z0 K; m) I#018
. u9 S$ @1 S- J+ X4 k" r#019 //获取当前字体的高度.
" A9 h, ~( y# M4 k1 u#020 TEXTMETRIC tmFont;. l2 n$ d6 s0 C
#021 if (GetTextMetrics(hDC,&tmFont))9 f4 P, b6 M0 v3 B' F
#022 {% e5 b* t) ^2 E% \- T, C: z9 I
#023 rcText.left = 10;
1 V; t3 d, S! @# |* t& q#024 rcText.top = 40;
6 s; \" B7 ]) j2 S b#025 rcText.right = 300;7 x% N$ w( t7 T: ]' i
#026 rcText.bottom = rcText.top + tmFont.tmHeight;
3 m( y$ t+ s6 _/ I#027 }
' |! B9 A4 d r$ [. u6 _- s0 G" H#028 else
6 Q, r- v' L" z1 G$ b9 f h#029 {: D" A; x8 J* ^4 X# t
#030 rcText.left = 10;
$ ^. r# E4 j% D" N5 {1 a#031 rcText.top = 40;
/ Z+ l) M6 _- O$ _( d! I#032 rcText.right = 300;
* @9 w6 g, E% X0 t1 ?#033 rcText.bottom = 80;
3 y8 f& G' {+ }#034 }
' Q) `% s' n) w. H' H; f2 o& N#035 7 B2 Z5 M4 n. Q
#036 //创建黑色的画刷,
7 L0 o7 I+ W9 G( p#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));# j S; W0 J( N( s8 _
#038
" L/ t# V. N7 ]% E. ]) E#039 //用黑色的画刷填充四边形的颜色.
; A5 m) F& w D+ M! a& ~; r2 @#040 FillRect(hDC,&rcText,hbrush);& L( g# x0 N! w1 l
#041 & O" l6 e0 L& I" X" z6 x$ c
#042 //删除画刷.$ J, W- a4 L6 B0 e- d! l
#043 DeleteObject(hbrush);0 c: E3 _" C1 z1 a
#044 0 R4 k7 a" L4 Z: @. D
#045 //设置透明背景
" n! O/ ]5 p2 k$ X! ~#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
( g/ t# V# U! l# E# M#047 7 }/ |2 @9 x8 y
#048 //显示字符串在四边形的中间位置.
: I8 Y( J" l" l5 w4 d7 t0 w. k: F#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
& O% a- G) h2 @" q7 C O#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
4 r. w2 u! e' X- l3 t. w#051
7 X+ Z' p, O. V) n#052 //恢复原来的字体.
) o B! L. |$ W) x% M- {. A#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);. \; X6 t/ p6 E. |
#054 DeleteObject(hFont);
$ E/ M1 I$ z2 \6 x/ a, f#055 : X* X! l: @; ~7 v
#056 //恢复原来的模式.+ @. c7 U- J6 n' e6 q+ j8 w, ?5 C
#057 SetBkMode(hDC,nOldMode);* d e1 l' c( C* B0 q! i
#058 ' V% X: G9 @; Y- @
#059 //恢复原来的颜色.3 s9 Y' ^7 W/ n
#060 SetTextColor(hDC,crOld);
# v# o8 t& a' A#061 }& }7 Z+ i, S9 l* {* G! ^
#062 |