http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
. O/ q2 S1 E/ r) ]6 G6 g
; G6 n; l R8 P0 a& a
1 U/ B/ S/ i2 {* [ ^在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。. w) Z: |3 P. n) X d( N! o
& `* u: J" G) ~+ ?- ^函数GetTextMetrics声明如下:
; y4 ^5 O$ o! C- d' F5 r0 o7 o s
! u) z# x, U& g+ L- D$ f7 Q8 j#ifndef NOTEXTMETRIC' T, X( d" D2 O% I9 E1 e6 R
/ d8 k: J. k6 F. q4 ~% ?
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
3 u4 a" X0 B) b+ A9 ~1 VWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);4 r$ K9 I( o# Z5 F7 u+ n/ s! o
#ifdef UNICODE
. t B# Y" Y' B$ o% [: S8 o#define GetTextMetrics GetTextMetricsW
' L' i$ T+ z2 d! P) `5 p* u#else/ w5 X' i- ]# {) s7 j M3 D
#define GetTextMetrics GetTextMetricsA
: q6 D/ U2 F. `. S+ }$ O#endif // !UNICODE
1 A8 `2 m g0 [* O
" H8 [$ [2 L* Jhdc是当前设备的句柄。6 y/ F6 P- n9 H% V5 \: w
lptm是获取当前字体属性的保存结构。它的结构定义如下:
+ E: z3 x, a! M$ }4 W. S% |( e& Utypedef struct tagTEXTMETRICW- }, M: r. J0 j6 `6 m. v
{1 {: Y4 Y5 q* b% M& \4 ~+ y
LONG tmHeight;
8 ~5 F% l7 ^& ] LONG tmAscent;% d, o' S# v9 H. ~! ]0 y+ O1 E. H
LONG tmDescent;0 x1 J' h3 U% K
LONG tmInternalLeading;
+ O" s5 z; j" e+ X- M# T LONG tmExternalLeading;7 t3 l1 h, h! o9 R; _6 y# V
LONG tmAveCharWidth;2 Q$ W6 R2 f+ {$ a& c! [! u
LONG tmMaxCharWidth;* U. p4 P- f8 D; a# X* d7 O
LONG tmWeight;
# y3 D7 ]3 D: a: b2 Q+ Z LONG tmOverhang; g6 U4 q2 o# a
LONG tmDigitizedAspectX;
* Q! s$ A- q" t5 w1 J LONG tmDigitizedAspectY;! n$ N* M# B% d& z* `0 q
WCHAR tmFirstChar;9 z) V* o( Y9 f% f1 [& r# S
WCHAR tmLastChar;
1 O& C0 k8 Q1 h% ~ WCHAR tmDefaultChar;
, l0 u: { I& d5 _- q8 | WCHAR tmBreakChar;2 Y! A+ H, z# s3 z$ j
BYTE tmItalic;
: c+ K! E+ p. P p/ b BYTE tmUnderlined;
" G" G) U! } `" f9 q BYTE tmStruckOut;
' w. \6 m5 i' G3 i7 j* D BYTE tmPitchAndFamily;
5 S' b0 r& ^# M1 M9 z/ x4 b( g BYTE tmCharSet;7 S8 ?9 f. t1 b7 P$ |
} TEXTMETRICW;. t& R' F0 q; h9 q
+ m/ g4 G* R7 @6 v
调用这个函数的例子如下:, X8 @3 s( F$ l- y0 [( D, s, Z
#001 //9 Z2 q' T8 S7 L2 V; N9 {
#002 //界面显示输出.7 O6 ]! Y0 c8 f
#003 //
$ \0 ^( r& M/ ^/ m; k. W! R#004 //蔡军生 2007/09/06 QQ:9073204 深圳* m6 p7 M' l' }
#005 //
2 |5 O7 X# {! `& g" l- ^#006 void CCaiWinMsg::OnDraw(HDC hDC)
4 E/ M$ ^) P: |% [3 ?2 M#007 {4 l M& R6 F: k3 V. i/ h
#008 /// R" C/ j0 K9 \
#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
9 h1 u( x' l1 [- a$ o#010
/ J3 i8 O0 y; C6 f6 {#011 //设置输出字符串的颜色.; \# {* r- k/ r
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
" T& C; [1 H. v9 y' R/ k#013
. b0 h. q G6 x; b1 ^7 ~, f#014 RECT rcText;
5 I F$ H7 l* W( w" [2 k8 u#015 * s3 [4 D! ?$ t( c% s; `
#016 //设置新字体. f8 a# b4 Y6 p( m3 @
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
- K2 B. _4 a$ s; C% I: [#018
) d \; o$ f9 y: l4 X8 d#019 //获取当前字体的高度.3 }1 e c# f: m1 \! }) O9 D
#020 TEXTMETRIC tmFont;9 A' c5 P' ]7 c* M* K m
#021 if (GetTextMetrics(hDC,&tmFont))
6 W: {1 a6 e7 X#022 {4 X3 p7 ^7 I! ?# s+ r
#023 rcText.left = 10;
* e7 b% c* X; f* Y% e9 F! `- W#024 rcText.top = 40;
; c3 ]6 z6 e+ T#025 rcText.right = 300;% e8 L* Z; m9 {( t
#026 rcText.bottom = rcText.top + tmFont.tmHeight;
; T% u! [7 a3 U1 e, Y/ `#027 }
* B4 r) V* n2 f7 J#028 else
. W$ e: C( J/ V% e) c#029 {6 a, M9 ^9 u y8 L0 I
#030 rcText.left = 10;
6 h! e% s# T! w1 i) f2 }3 @: u0 j#031 rcText.top = 40;0 {5 x; @0 m7 E$ M/ a8 s) L9 {- c
#032 rcText.right = 300;
, x; ]+ q4 X: q" ^- r1 T# ~5 I#033 rcText.bottom = 80;6 @ j! s& n& }# i K3 I
#034 }
1 h w4 v- v. l#035 " Y7 j* q' U# S0 v$ j; @! X8 h
#036 //创建黑色的画刷,3 J' Y' O& a. {( b! c' m, D, o) n
#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));8 `6 w4 x- m2 `8 _, X2 U4 i5 U
#038 ( k; ]1 s5 W( W
#039 //用黑色的画刷填充四边形的颜色.
7 Y9 X* G+ Z1 j) B) S#040 FillRect(hDC,&rcText,hbrush);
) p0 w4 P0 V- m: f9 l2 [#041 9 M; G# r& q5 m6 [6 m' u
#042 //删除画刷.
& Y i2 O1 x+ g( j#043 DeleteObject(hbrush);
( K7 N& `" e7 a8 v+ W0 A#044 ! ]- |; A! h+ {! F- \8 [' v) M
#045 //设置透明背景' ~3 `( d' C" P; U9 M. Q$ Z1 ]
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);, e2 M# E; Y: r% M
#047 3 ]# i" l6 b, H! t
#048 //显示字符串在四边形的中间位置.6 s/ W( C& f4 h3 d9 E' q
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
/ g4 _4 L( q Y9 }- F G7 o. g# E#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);8 o- w0 t4 O, R: u; A, U) e3 l
#051 4 R# I; }- v3 J( N* J% L( D' Z; j
#052 //恢复原来的字体.
: d9 d$ A7 C7 {$ s5 y: p6 {- [#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);2 O3 b) ~4 S8 w
#054 DeleteObject(hFont);8 _- W, S0 H% w" t9 V3 O8 y
#055 # ~. i+ i9 m) m
#056 //恢复原来的模式.8 K9 i3 ~6 {/ d, ~
#057 SetBkMode(hDC,nOldMode);
% M: d" x! w; u; I* m% A#058
2 r% C/ O* g9 ]& L* w#059 //恢复原来的颜色.
3 s+ a: s3 N9 c' ~#060 SetTextColor(hDC,crOld);4 X4 B* y! l7 k# f* ]
#061 }
$ H' b9 _ A, r/ P: j: O6 O#062 |