http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx/ i' l! y/ T) Y: d' ~
) d2 D, x) _8 S' t9 {
! q- z- Y9 m3 s" z. `, n
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
* u9 i! N3 D; s 5 Z! {# ]( S+ v w8 I
函数GetTextMetrics声明如下:) e# X+ p( W: z3 Q" g `
$ `8 B! [4 n0 w#ifndef NOTEXTMETRIC
5 U, _0 V' J/ `+ h/ Z1 H' Q+ N " i. z* a* C1 }* g2 ?! Y# E. X
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
/ N, s" Z T( a2 o x+ N+ AWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
) [2 K& T' L: t#ifdef UNICODE0 O+ I: H( f$ q; s
#define GetTextMetrics GetTextMetricsW# F- b7 p& v+ b( I) S
#else
7 K' A9 w/ L! } J9 |4 H% O#define GetTextMetrics GetTextMetricsA
% `& ~3 P K* w. Q8 r) p#endif // !UNICODE1 ~/ E0 u. s) M# `1 u4 x
3 d) f- v3 b3 l$ H) R& G# chdc是当前设备的句柄。
$ p; I5 w* ? P* V+ nlptm是获取当前字体属性的保存结构。它的结构定义如下:# Z( s6 G- y8 f1 b
typedef struct tagTEXTMETRICW1 [) W& b+ |* D, }& Z$ g T1 t
{
' _3 y* U; O. Y D4 H LONG tmHeight;8 x) |7 t" K/ K8 b% u# {
LONG tmAscent;
7 O( h0 O- h( N! r LONG tmDescent;( e: N I8 m2 ]5 _) D
LONG tmInternalLeading;
" V5 o2 y0 T) f9 b. `- H LONG tmExternalLeading;1 `6 L8 v& t1 f3 k4 D8 P
LONG tmAveCharWidth;
$ u( ?; O# J0 @: `! Z8 g! w LONG tmMaxCharWidth;: Q' p% r C! r$ H& J: C# P
LONG tmWeight;
# v" m4 `& Z; r LONG tmOverhang;$ Y+ |1 N1 s" [5 P% }# }, J5 _
LONG tmDigitizedAspectX;: B/ T" E' W0 R7 L
LONG tmDigitizedAspectY;
0 ?' p5 Y+ o& t( r$ B9 A$ X3 P WCHAR tmFirstChar;! T0 @# k) x* ^5 I8 n
WCHAR tmLastChar;
1 v- z7 L. y/ m WCHAR tmDefaultChar;
* A" m% \# m$ G- z: @' Q7 D H WCHAR tmBreakChar;! i+ Z/ S! e& Y$ x) A
BYTE tmItalic;% u2 O( }) K4 ^; o' x3 C0 A5 X3 T
BYTE tmUnderlined;: F! Q/ E$ ~: [& e' r$ q
BYTE tmStruckOut;) M" o _' P* n5 p; W3 v+ E% @
BYTE tmPitchAndFamily;
+ i% X$ z( u+ A5 A BYTE tmCharSet;
, [/ q. `. {+ n! V9 Q! H } TEXTMETRICW;
' Z5 ]/ }6 ?% l( |3 X* v
7 T$ {- j7 ~, }4 q" ?调用这个函数的例子如下:
) V- S! I) S3 J, ?#001 //* ~! [4 l2 v/ }" E! g
#002 //界面显示输出., Z: a8 ?3 z0 I) P. s0 g
#003 //. X7 z' M! Q [6 B
#004 //蔡军生 2007/09/06 QQ:9073204 深圳. M6 A4 G: x) w! W8 [3 P2 a0 B) I
#005 //% Y3 ^$ E# k% t9 S# d' \& M1 L6 `
#006 void CCaiWinMsg::OnDraw(HDC hDC): G6 r5 j3 l: z/ [
#007 {: ^# }2 g- d4 o) J: W9 S
#008 //
, O% h/ o4 U# I; N9 b/ [! Z1 M: F#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));3 F/ |* w* Z+ R& n# k
#010 & z+ I9 B! E4 D4 C" t( f4 B6 }
#011 //设置输出字符串的颜色.
" Z5 G0 v [0 u#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));$ _% @2 o: M, W X
#013
. a. L! p/ S y( [#014 RECT rcText;
- S, _& x1 E/ E1 H+ s6 L0 a f#015 & D7 t5 n: U( D; P6 Y# L
#016 //设置新字体.) w; D' w5 e6 j+ ^' @6 ?4 Q
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
- P- [; }' A! G4 ?#018 - f% J2 c- l& r$ S* U0 k4 B% j2 L
#019 //获取当前字体的高度.& x) K' `) @: I) @3 f
#020 TEXTMETRIC tmFont;) u$ y. \ ?" B c. T3 Q1 o
#021 if (GetTextMetrics(hDC,&tmFont))6 g' A9 y. V; T/ L
#022 {3 V7 s6 |2 k( S' M
#023 rcText.left = 10;# S: Z3 I5 T3 N# S: F: r
#024 rcText.top = 40;+ }* r, a' _* ]* H* m9 }! s4 ]
#025 rcText.right = 300;
- }! V) C# S3 r# w% D) e: b* A4 ?#026 rcText.bottom = rcText.top + tmFont.tmHeight; 6 Y$ V R7 C7 q
#027 }
" ^$ K s( w- p5 s. U1 k: t#028 else' s9 I+ U$ O' `) @; z
#029 {( _2 D7 E- ~ R0 l7 Y; k
#030 rcText.left = 10;
: O$ } e# y) X$ c% s* u/ B#031 rcText.top = 40;8 _! y! k; c3 ?1 J
#032 rcText.right = 300;
4 k a9 f6 r# N/ @$ c t, u#033 rcText.bottom = 80;/ t) ~8 O! z" z) j# z
#034 }9 B# y6 t9 t3 j/ b* e2 t+ @5 L
#035 ! x( a& z$ O/ S0 E7 M* v6 _2 b
#036 //创建黑色的画刷,
7 N* u2 T: K' V+ u#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));% ?' y! c7 F6 J: Q& X6 G1 Y
#038 / z5 T$ Z) D/ W9 F. l: |( I6 K
#039 //用黑色的画刷填充四边形的颜色.* [& q! {. B& @/ {# C
#040 FillRect(hDC,&rcText,hbrush);4 E: r! B$ l, f# `
#041 ( {% X! t6 M% a. {. n/ B
#042 //删除画刷.
( P, f8 I' N. w& |#043 DeleteObject(hbrush);
* K- v& J3 s1 m* C& y9 P1 f, y#044 & u3 m7 G! O% ~
#045 //设置透明背景& U% _. y7 |9 d" i7 `
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
( [. Z5 ^9 s6 k3 I5 `9 \#047
/ _; Y6 F0 F! k2 V& C#048 //显示字符串在四边形的中间位置.
: S) ^6 `9 \) X/ Z7 k8 z/ F#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
# q! E2 t4 F$ L! O1 x& Q' c* Z#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);6 @# a. S; t c; j. N/ s
#051
5 h3 {1 g; U+ d' R#052 //恢复原来的字体.( G5 @9 f7 e% { l
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
! l; I* @" x: p6 p& R7 [4 C#054 DeleteObject(hFont);9 {8 B2 x, Y" d% _6 U
#055 # `1 r. Q8 v2 G: z4 H4 n/ y
#056 //恢复原来的模式." H6 c' P$ q5 o- O' b4 b. c
#057 SetBkMode(hDC,nOldMode);& O8 k" [" p) T4 R' ?, o8 x' P
#058 ' F j3 J7 [8 X( c. A" r
#059 //恢复原来的颜色.
3 j0 J% P z6 c- @- y8 {. {#060 SetTextColor(hDC,crOld);
* v4 |8 ?- @3 j& |) l#061 }
) M# ~! z S& [, m#062 |