http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx% S, w4 K0 N9 ]' g* Z* Y
8 m( a( \7 v d4 C
2 U2 _, N- j# Z在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。" ?. O+ ?: ^# i. a' F" D$ ~ @
& b% ~; h, A2 o3 w0 [
函数GetTextMetrics声明如下:1 k& Z2 v, k2 }8 w
' N$ k8 |/ C4 c, @7 {: A* r, r
#ifndef NOTEXTMETRIC' r W# S9 Q9 s! S
/ e' m9 W$ ~1 o; X+ e7 M, y) tWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);7 J1 P1 i, k/ Y$ c' \
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);% R7 W* c/ ^2 _4 l7 R- l7 v
#ifdef UNICODE
4 z% ^" |1 [! d2 A) {#define GetTextMetrics GetTextMetricsW
: S; k' O6 D4 z4 _. p#else
$ U; ` |0 I$ L' K8 K1 g; R: F#define GetTextMetrics GetTextMetricsA
+ t8 J, V) S: v; U#endif // !UNICODE
6 c3 y* m/ T) ?1 o7 m9 y
* y6 P, j5 ?; I: V5 i6 @hdc是当前设备的句柄。/ q, Y8 W3 }+ Z @/ z# q& m
lptm是获取当前字体属性的保存结构。它的结构定义如下:7 V8 z# x& H6 P9 x; j! T
typedef struct tagTEXTMETRICW
; Q; o% t' y$ H: g8 {- s4 U/ W8 s {) { v; e# ?% t& L' i( z
LONG tmHeight;
9 x# s% w* i0 q' M% R9 K LONG tmAscent;1 I9 H" V9 a# _( \0 b, Y
LONG tmDescent;5 C; M8 N z. g. o; n, O
LONG tmInternalLeading;. R( d0 U+ K$ J# k9 y
LONG tmExternalLeading;
+ {7 i& `2 k2 F* E P LONG tmAveCharWidth;, w' ]% X6 ?, y8 L) e
LONG tmMaxCharWidth;
" u9 ]5 k3 @ R0 T0 q& S4 v LONG tmWeight;6 D/ i% x- P; H
LONG tmOverhang;
* W2 O9 [! q2 V LONG tmDigitizedAspectX;
\6 z) @7 v0 K LONG tmDigitizedAspectY;' V. x; Y# ^! J
WCHAR tmFirstChar;
/ H) s: o& m7 z' w" T WCHAR tmLastChar;3 }6 X5 Y$ ` R7 @& [2 h+ [
WCHAR tmDefaultChar;
& i3 p- I: |" V! R" \ WCHAR tmBreakChar;
& J8 \! Q0 K- K, n/ }- U% R1 c BYTE tmItalic;/ [ J9 P, Y& Z9 ^! @ ]" e- a
BYTE tmUnderlined;
, `/ x1 Z- _$ e: m' m W BYTE tmStruckOut;
( H) a5 `$ ]& f( M BYTE tmPitchAndFamily;4 z3 `. A$ q" i/ l: D0 W9 Q
BYTE tmCharSet;2 I4 s0 c/ C1 q( t& S/ X0 E
} TEXTMETRICW;4 ]. E* h/ @5 r" `1 ^3 H
* j: h* ~: C: K B, g+ \# g
调用这个函数的例子如下:
! c. T# V- L% e b; X#001 //
" Z1 y+ d3 V) P7 R m7 J9 _. F1 j#002 //界面显示输出.5 u( X5 ?* N/ K: w/ d, ^, v
#003 //
& _# Z. z' v T& k2 I#004 //蔡军生 2007/09/06 QQ:9073204 深圳& h% ^$ K8 R' A/ E
#005 //: V# t- P/ X% I) W# g; N0 |
#006 void CCaiWinMsg::OnDraw(HDC hDC)7 K6 b& y' {7 K4 @/ L1 h0 {
#007 {
1 A" F: }7 x7 m; F4 b#008 //8 e- U# x& i5 ]( y1 z0 d& [
#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));+ I' Y" A2 Z7 ~) c0 w( a
#010 & M3 U. u: p6 C$ z/ H9 d* Q! C& I7 Q
#011 //设置输出字符串的颜色.
. v0 [/ _) d& Q#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));% H, ^0 Y/ D' U& @; E
#013 6 {# X G+ V. h: D
#014 RECT rcText;
( T8 _5 F/ y4 g# v/ R0 w#015
% V5 D4 r% O1 ]$ I9 V7 ?#016 //设置新字体.
# ^" l1 y T7 K7 i6 D#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());, i) v# O- ~) {9 w" E
#018
' T# G# {- p9 [1 V#019 //获取当前字体的高度. j1 A% ?" r; m2 K' t$ e! a$ B
#020 TEXTMETRIC tmFont;
" D ]$ a) |$ l/ D0 B! s#021 if (GetTextMetrics(hDC,&tmFont))8 I b. t7 A6 {$ g
#022 {
# b6 J; e E* z1 v, T#023 rcText.left = 10; R4 u: t' |" y. M
#024 rcText.top = 40;
: w7 P M: s, Q4 W* U#025 rcText.right = 300;: S* C0 ~. `6 C
#026 rcText.bottom = rcText.top + tmFont.tmHeight; - o, t5 k7 h4 y1 N4 Y9 @- |' z5 d) |
#027 }0 Y) W- n9 ~# V+ b5 T* D
#028 else
! n$ V/ `# f7 u, t#029 {4 F& e f3 A; P0 Z6 ?! Y2 M
#030 rcText.left = 10;
2 r# \ d8 ?( H- l3 O3 }#031 rcText.top = 40;1 d: T; S7 U! d- g8 t" k
#032 rcText.right = 300;
7 x8 C3 @, R- W0 a" x/ w- M1 d1 U#033 rcText.bottom = 80;' h9 @: n' S: ]; U9 a& m
#034 }6 M. S) R; D3 E% N L
#035
0 g! n- r2 b) r#036 //创建黑色的画刷,
) @6 s) Y- x+ `, m0 m( K O#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));5 P. n; l4 O" d- I, O% w
#038
. |5 M+ Y. i @/ {& A6 k7 G, ]#039 //用黑色的画刷填充四边形的颜色.
: `* M4 w& G; U# R9 c#040 FillRect(hDC,&rcText,hbrush);" T* S* i( q+ ~
#041 2 z5 z% X5 F4 X) g1 u1 U7 }
#042 //删除画刷.
0 [$ p. \) S! m( z' `" O7 B6 `- s#043 DeleteObject(hbrush);$ s9 T5 Y5 g. ^+ a$ }5 A
#044
% m8 c x0 S9 k, m8 d) U F q" k#045 //设置透明背景+ P! v+ F( r* P ~+ ^) W. o
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);* U6 F+ A9 R5 b
#047
0 J, Q( A, D1 A9 W#048 //显示字符串在四边形的中间位置.
* U ^ [4 L, F2 _/ }2 A#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
" O3 d s2 D1 v; { G#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
0 t. m1 b- B! Q4 }#051 ( m5 J$ n2 j, X+ X1 J% g7 F% u, U
#052 //恢复原来的字体.
" p7 r7 Y5 `3 H* } y#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
1 J6 s6 n/ i2 M$ N& c8 @#054 DeleteObject(hFont);" `( B+ `: A/ Q
#055 1 j: l% l! \$ f9 Q8 s9 t
#056 //恢复原来的模式.
3 n: w/ A. }+ `' Z4 \1 C#057 SetBkMode(hDC,nOldMode);
8 I4 \6 `* A6 a- {' ?6 x4 H2 a#058 9 y9 A' p N/ k7 {7 B4 t
#059 //恢复原来的颜色." v9 s* h& _( O
#060 SetTextColor(hDC,crOld);
$ ]% n: D' @/ c& ?+ R#061 }( @0 j' t' S8 L Z7 O
#062 |