http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
/ K& G' \8 \* j2 J, K/ D3 t, J
+ t6 ?. W$ f4 ^, C) B, d1 O, G0 @6 k4 z
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。: H$ k7 h8 |. u2 T3 L
6 _* m( y% M- c, p0 {
函数GetTextMetrics声明如下:
; g( V2 b! p4 a% D . j i8 t, v" `
#ifndef NOTEXTMETRIC
) u' F7 @# f0 D1 C0 _8 s# X* E
7 Z! Z% A8 ?; [5 dWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
5 }7 r9 @8 i/ c" n" i4 ?: KWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
$ P Z F. Q& g+ A/ i+ v5 c#ifdef UNICODE
5 y- w3 o9 p: V4 \8 w" \#define GetTextMetrics GetTextMetricsW7 Q$ z/ |, Q' e! D: N3 X2 V
#else
$ h( X1 z; b1 I( Y9 K3 I! q#define GetTextMetrics GetTextMetricsA9 e/ `) G% @! O! S u/ p7 Y
#endif // !UNICODE8 M) k* k7 @$ i+ P7 Y( o
9 }1 `' L8 F- W- Q7 B9 g! u
hdc是当前设备的句柄。: S% R$ }) W- f) F9 m
lptm是获取当前字体属性的保存结构。它的结构定义如下:
$ [" N, R e# @0 g; H Otypedef struct tagTEXTMETRICW2 i5 F; q) [& O) V/ v
{$ N A- \4 H( y: N d
LONG tmHeight;+ {4 h9 m# t1 y$ K/ V; n
LONG tmAscent;& N1 I W! W2 g* V0 Q3 p
LONG tmDescent;
" p9 H3 E7 Y6 Z$ z$ r! F LONG tmInternalLeading;* E. [% D5 ~* @/ T; h+ K
LONG tmExternalLeading;
0 [5 j6 K' r8 o+ ` LONG tmAveCharWidth;9 H/ J$ g5 B, H& U" L
LONG tmMaxCharWidth; `; g- W, X) |7 \$ G: j( Q
LONG tmWeight;/ X. h, U+ v- S: t4 O& K/ a
LONG tmOverhang;0 F5 A! q, {$ ]% M
LONG tmDigitizedAspectX;
. m! |6 }' z% U: D) i+ N* R LONG tmDigitizedAspectY;
7 f+ A( v" q0 X4 Y WCHAR tmFirstChar;. r x* o( R' M' C9 {" E
WCHAR tmLastChar;$ H+ L+ c3 r, Z: r" I; y
WCHAR tmDefaultChar;
; N/ g& U0 f4 B$ w5 h2 `- z WCHAR tmBreakChar;
6 L* ?1 k! S6 n! B$ A BYTE tmItalic;" I4 e4 [1 m$ p* g4 [ @
BYTE tmUnderlined;0 s7 B7 ^1 ?* |5 X y
BYTE tmStruckOut;* v; A$ L, y9 ^0 B
BYTE tmPitchAndFamily;0 B3 H! T4 k4 R" `* H# w
BYTE tmCharSet;2 k# q; x+ V' U. V
} TEXTMETRICW;
7 @5 [8 j( C9 ^# O% G8 p7 @
/ U& ~0 d1 ? c4 U7 \调用这个函数的例子如下:
/ V1 o* A0 E. L# Q& b) S#001 //
9 o( h `+ e9 M1 u* l& @: f#002 //界面显示输出.# y1 ]# u* N7 S: J+ r
#003 //$ @: z+ {- A$ X! i3 W
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
' i# [+ W- ^" _#005 //! s9 ^* y2 k0 {/ [+ k$ l
#006 void CCaiWinMsg::OnDraw(HDC hDC)
+ ~- i2 s+ e5 p( k, {# {, Y1 D#007 {4 |% Q! N+ Y( i7 H8 B5 D' A1 q
#008 //
- `5 n7 ^) F5 V+ q/ t7 B#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
. U" U$ G& W3 n2 e/ r6 C( I#010
2 }6 M& l( j& J3 I- D" G#011 //设置输出字符串的颜色.
5 l8 T/ k- Q% T1 B' ~8 J/ t#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
6 _; n% v' M+ r' J#013
7 s- {9 p5 N4 w+ P7 R#014 RECT rcText; 0 c m, d% Y# _0 g, E6 t
#015 1 q' `+ g, v1 C, z% M n
#016 //设置新字体.' M3 Y7 r) B# [ U) j' B
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
$ V$ b' {: c, o& M#018 0 r0 v1 g. D( a+ r, R6 A/ Y
#019 //获取当前字体的高度.+ ]4 F4 e1 g# Y
#020 TEXTMETRIC tmFont;
& ?2 M& V$ s* B! g#021 if (GetTextMetrics(hDC,&tmFont))4 Q2 U0 r6 i' |0 R0 z/ R: V$ M
#022 {. c. q( }3 p: K v" E N' @
#023 rcText.left = 10;7 @/ q% f0 [' f9 \1 F9 M
#024 rcText.top = 40;8 {& A* b' r' r' G) V
#025 rcText.right = 300;
: E7 O) T4 C2 J3 C& o" |#026 rcText.bottom = rcText.top + tmFont.tmHeight;
* F; |' X7 q4 }; u#027 }
% ~& y/ @$ {: [5 N! r u#028 else$ e" P. F+ T3 y/ I/ D f1 o/ S
#029 {& D; m$ k K" M# x% G' r) w
#030 rcText.left = 10;
1 D) ^6 ~0 I" J5 Q/ n, b/ `6 ~#031 rcText.top = 40;5 l' d/ d& w! _* v: C1 v
#032 rcText.right = 300;, R' c3 R" v [2 i6 g" H
#033 rcText.bottom = 80;
% a4 {; v7 d1 x7 l: |% ]2 D K+ u* C6 T' |#034 }
! s/ r) P% m* ^#035
& Z; }, s: w; Q& l4 ]! K#036 //创建黑色的画刷,
& [' u% |0 p3 R5 X" p. z#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));# o! B/ }- ^% a! d# c2 P5 j
#038
- q) r" v+ M9 ?2 {/ d#039 //用黑色的画刷填充四边形的颜色.1 K- x/ X* x: o b6 P% A
#040 FillRect(hDC,&rcText,hbrush);" X% j$ L$ K) F. A, w4 {
#041
- p! X$ k) b. \: Q6 `- I#042 //删除画刷.
( r& n' Q2 I9 @; O#043 DeleteObject(hbrush);* |, v3 h2 ?% s, v/ E- }
#044
: m! n, P2 r% m' i( c" S#045 //设置透明背景7 R. Q: U I& z, c4 b6 t4 n# S e
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);5 A5 |: Q! C; x' s3 _/ i0 X& N
#047
2 J/ l3 {- B) B#048 //显示字符串在四边形的中间位置.
1 D$ {+ v+ l0 _' M2 T#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
6 W) R/ ?' D8 _; e#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);: o/ g2 i" L1 p5 b& ]2 w
#051 4 Y* R; }9 s2 f/ N4 z
#052 //恢复原来的字体.2 W2 u" `# {8 h/ m! E4 s5 b
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
Q, Q1 q! |/ _8 n7 k#054 DeleteObject(hFont);2 E) |$ C0 D |
#055
% |4 _& Y q5 o$ E1 A: r#056 //恢复原来的模式.( n6 c9 H4 c: H: _1 _7 r0 Y
#057 SetBkMode(hDC,nOldMode);
C# [) y4 k" q, B3 N6 P#058
) W7 V2 E' o% H$ P. Q8 k0 ]#059 //恢复原来的颜色.
( R/ j3 m& W& H! A, g) J+ c#060 SetTextColor(hDC,crOld);% h4 G9 i5 c% S E& d
#061 }
5 H8 `: t- A% S/ n5 D#062 |