http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx" A6 Q0 @: j9 d
@# P# } F5 u) Q/ H6 ~9 _5 u
4 o9 v# Q# \/ I3 }0 G. X在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
4 W. B6 }. D" q. W6 Q( G: S: Y3 a; K 8 d; V* n: f. W b) s" o0 V
函数GetTextMetrics声明如下:8 a: e/ o5 n1 Y5 p& Q: F
, N; o5 @- {. L& \ _& ^#ifndef NOTEXTMETRIC; _! t$ h Z/ A* y! D; R$ j
. B/ o6 J% A& j5 {7 [' b! s
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);5 P; h: c0 D) h6 l5 P9 ~* u! W
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);' j* |+ o/ D2 @8 F$ j" A% u
#ifdef UNICODE
% R1 M. M% T; B6 x" S/ Y* T- Z7 J#define GetTextMetrics GetTextMetricsW; T' c! d" \, m* b9 g
#else
. d1 K: l6 z0 }/ q! _( j% ^" H7 Q- v0 q#define GetTextMetrics GetTextMetricsA& z9 h/ R; p8 e+ R, z: Q% n
#endif // !UNICODE! Y9 ~' D5 {1 ^0 p% S p: |4 y
|4 O I l1 ]/ M2 V
hdc是当前设备的句柄。
: y( ^0 ?; I5 b. c, T+ l6 |& r: Elptm是获取当前字体属性的保存结构。它的结构定义如下:; g6 o4 k7 O( Y, B6 f. c# R
typedef struct tagTEXTMETRICW
: }/ f6 e, N9 \* c1 x: [ {
" c& W1 q% `( \0 E8 O1 o LONG tmHeight;4 s9 O7 [. e% q0 e3 D2 ^
LONG tmAscent;3 F$ ~# U! f& i0 j, F7 Y
LONG tmDescent;- J# K1 |) P: H K! U
LONG tmInternalLeading;! E2 z8 d8 o( ^# h
LONG tmExternalLeading;
' b8 n% x( j0 o LONG tmAveCharWidth;
1 ^9 o* {0 g+ P1 } LONG tmMaxCharWidth;
5 n9 _% d; @ [* G8 ] O LONG tmWeight;/ O# T5 M- l. \9 F1 d2 F9 P" E
LONG tmOverhang;) |! z) N0 C! h4 S
LONG tmDigitizedAspectX;
( F4 o4 Q" r- |% G" B, { LONG tmDigitizedAspectY;
! \: y4 T6 B% \6 N% F6 J* E5 ` WCHAR tmFirstChar;
" K9 p6 k- u, C+ T! d9 u( C; e WCHAR tmLastChar;) o3 Z0 ?: W; a$ y7 n
WCHAR tmDefaultChar;
9 n7 z0 v0 Q& {* }( I WCHAR tmBreakChar;$ f! n* z; {& \. H4 N% b7 Y
BYTE tmItalic;! R+ z" i" O, R( m/ R( W
BYTE tmUnderlined;
% U3 v2 D3 x) K% ^1 e9 m- |6 q BYTE tmStruckOut;
! I8 n) O" @4 d7 O9 S% I0 y BYTE tmPitchAndFamily;
3 z& r* b% W" {5 ?' I; Y BYTE tmCharSet;2 D" \5 P" h4 d# k6 Y* k% ?0 E
} TEXTMETRICW;) z. X# G* [; |4 ^% G B3 M
( h, j; Y) R* a& T f( u! x+ |; K调用这个函数的例子如下:; I+ D' E1 g( P3 `" T) k, D
#001 //& o" ~& _. ^. V4 y4 s0 [, |$ m
#002 //界面显示输出.% A' t% g" r4 ]0 S; C1 y
#003 //
; R8 |6 ]( q- i' I* g7 i#004 //蔡军生 2007/09/06 QQ:9073204 深圳4 _& V% k7 R: @3 @% V
#005 //! n" M0 d0 {+ h* L, H& Q+ U
#006 void CCaiWinMsg::OnDraw(HDC hDC), Z% ?, l) t( O0 Y* X
#007 {
5 D% k. C$ c& g1 f/ k) E C3 v#008 //
' V& t# h2 t V7 v# z#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
; b- N% f" n' b3 B) T#010 . Z' f: x) o( o" z9 }' [
#011 //设置输出字符串的颜色., {+ i* d2 u; @5 W# a. w/ @
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));) A; ~; g- B% o- O: R
#013
4 q5 r- {' Z+ \- C' i. z) W#014 RECT rcText; ; }& ]9 K' y( K. D3 a9 [& t5 H
#015 # i' C- t' ?5 ]% m Z) ~' d
#016 //设置新字体.
* ]# b M1 l& H: L0 v) Q; u#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());- A2 l3 z/ r* r4 o
#018 2 n( w0 x0 s9 L/ k) G1 m) a! w
#019 //获取当前字体的高度.: {9 {& V0 ]6 L- G
#020 TEXTMETRIC tmFont;
5 T/ _$ ^' u% ` U#021 if (GetTextMetrics(hDC,&tmFont))$ @. y5 l3 @" W4 g) v- h
#022 {
; O4 ^, `( D9 a9 o* G( x; W#023 rcText.left = 10;
* |5 _* x1 ?+ `5 n& S#024 rcText.top = 40;4 d" u* v6 ~! z+ r: }4 o4 F( W
#025 rcText.right = 300;
# b6 B6 U5 }+ ^( K5 ^* {, G#026 rcText.bottom = rcText.top + tmFont.tmHeight;
7 K. @" y) W" O7 {0 O% k8 z6 v#027 }. W5 @# I! V: Y6 l& I
#028 else
- m; B- [' p, L( P# m#029 {
/ ^! F V) k E#030 rcText.left = 10; ]2 n+ C5 r0 H
#031 rcText.top = 40;6 [2 A, I0 F' e
#032 rcText.right = 300;
* g" {* ]+ X9 c$ W8 \3 p. |#033 rcText.bottom = 80;4 d( i- h2 h' I. H& p* V
#034 }7 @* ~% ~. J0 L0 r+ d7 E
#035 * K* ?2 B- C9 F! F2 s
#036 //创建黑色的画刷,
7 S# C' P4 W! C" }#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
# k/ ~3 G- ?1 T#038 B9 _0 S% ]7 J) m {) `* M Y8 E
#039 //用黑色的画刷填充四边形的颜色.$ R0 _5 k1 K( D( X. W* K
#040 FillRect(hDC,&rcText,hbrush);' s: d' T" g. h9 Y3 S1 u* @
#041
1 ]: E" A c" Z! ]#042 //删除画刷.
5 k3 q/ k. `5 N' \5 J. Y#043 DeleteObject(hbrush);
( [! S; Q; L/ }& Y4 c0 C. E2 w#044 ) O: x* @3 ^6 u5 S# @% A8 Q3 k; p
#045 //设置透明背景8 U6 d0 m2 d* F5 C+ K
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
+ {5 @* I8 G5 C4 }/ D$ n. j#047 8 ]2 n; |) V/ [3 j* J
#048 //显示字符串在四边形的中间位置.
$ a7 q% m" d4 w. q3 a#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,& {0 w, @2 u% E. h5 Y
#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
- |% }" R( s$ P4 z. D! }4 ~) b/ e#051 # J6 L' Y& _2 X/ U C" h
#052 //恢复原来的字体.
( @& w }2 x2 v+ z, B3 y* H9 ~4 H#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
$ u @7 X- M. c#054 DeleteObject(hFont);8 @3 \. s. }4 [
#055
W& V' P9 v" j9 A' B; L#056 //恢复原来的模式.: K) Y! Y+ s( L; ]1 I- | C A3 O
#057 SetBkMode(hDC,nOldMode);# x( n! A5 v: V0 [) b
#058
# e% J0 [. ~4 s#059 //恢复原来的颜色.
3 n/ ^/ N( R3 J! I#060 SetTextColor(hDC,crOld);$ X" ~) ^* E2 h+ } F' A7 h
#061 }5 B3 I7 _' @# e4 F
#062 |