http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx- A4 w: ]' ^4 |! S& \8 E7 f
" T" M D: B8 }
9 B) {& K9 h# s$ a" C6 I. u) |# d, Y在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。& o2 a+ W+ u& r% Q6 r% Q5 d! ~3 t* O
& M# X9 p' [+ E/ H函数GetTextMetrics声明如下:5 M% _5 v/ l$ W
" O& b* D- ]$ B1 V#ifndef NOTEXTMETRIC
! x. _& Y6 O( ?4 A
, z3 w7 k. _1 k( |WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);, j2 m% S3 i& M
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
' r7 O3 ~4 e# S$ e8 I#ifdef UNICODE0 ]! R, u' f a1 E9 d4 e
#define GetTextMetrics GetTextMetricsW
/ _* l& m8 r8 @- h) i" G( z#else+ v! }! e4 A7 O5 X6 a
#define GetTextMetrics GetTextMetricsA
. P# x4 W5 @6 Z* b" g#endif // !UNICODE
+ q/ R0 w+ k9 [/ g , U y0 a. e: s& o% c
hdc是当前设备的句柄。
2 Q b2 w' C5 N8 G* g2 Wlptm是获取当前字体属性的保存结构。它的结构定义如下:
1 ]& I; O* X$ p" b2 vtypedef struct tagTEXTMETRICW
# r( R: e$ ~( [; R9 B3 @7 F {
' w1 H2 K$ h. a/ M LONG tmHeight;
) Q' F- s( D6 J. Y2 L I8 L LONG tmAscent;
) A% g- D# Y1 O$ F. u! x LONG tmDescent; i+ w) }4 F" B) N" @
LONG tmInternalLeading;
9 C9 M' `9 F n4 {$ N LONG tmExternalLeading;4 M5 ]0 u$ q Y$ r1 W
LONG tmAveCharWidth;# t4 \4 U' B. C; u% U. [
LONG tmMaxCharWidth;
5 @" w7 ]- X- D LONG tmWeight;9 r4 A( ]- \$ w+ X9 F' s3 F/ x
LONG tmOverhang;
0 i& a: L8 ]- I V+ z9 d3 `9 F LONG tmDigitizedAspectX;( k. {/ J; D& @+ f" L$ J
LONG tmDigitizedAspectY;
; [- }0 V2 E6 t7 X WCHAR tmFirstChar;3 z* R; o3 S* U7 Y% T) _9 ~
WCHAR tmLastChar;
. F$ a( b5 Z& a WCHAR tmDefaultChar;( m1 K, Q$ g) m" z& H4 r
WCHAR tmBreakChar;" J# R$ |% S7 ?
BYTE tmItalic;4 W! I% _( s: ]% U! d3 f* A$ u* g
BYTE tmUnderlined;2 s) a& s! k, ~# z/ B1 i
BYTE tmStruckOut;6 l) `1 M2 s4 p! X
BYTE tmPitchAndFamily;
+ U$ H4 D8 y7 X {% v BYTE tmCharSet;
$ \% c% r- {* v } TEXTMETRICW;
2 Y. M" F5 J& `
7 u9 c# {( f$ _6 k) G# B/ y调用这个函数的例子如下:
! ?# C. M$ Z) C, _#001 //
6 F* E5 P7 t U9 w4 Q) N$ I1 x#002 //界面显示输出.
; z+ y: V4 U( v; O( U3 _: X) T+ h#003 //
. @9 p' R$ ?* w' h) X9 [- ~% J#004 //蔡军生 2007/09/06 QQ:9073204 深圳
3 A, v1 i8 h8 G#005 //) Q, z/ G( \6 a
#006 void CCaiWinMsg::OnDraw(HDC hDC)$ k$ T& H, M( M; k M
#007 {
3 T) N6 A) [+ Q2 c2 D- G$ {& @#008 //
6 ]/ p0 ^4 W0 g+ b7 Q#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));, Q% U. z; m- O& L2 |0 a) p
#010 8 [6 \4 o, I" r
#011 //设置输出字符串的颜色.
5 f8 u0 h4 Z" |#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));7 i( w! O5 e1 c
#013 * x: I; D0 v! j; S; L
#014 RECT rcText; 6 B G6 |& K/ R( Z- y3 P n
#015
0 {9 ]$ f r9 {$ L4 a! K#016 //设置新字体.
2 G2 g! ~. d$ ~4 w A1 S+ y#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());9 A+ r( b- [8 d O
#018 $ a6 G6 z, v% a$ u3 p/ Y
#019 //获取当前字体的高度.
. D# H4 l2 B+ P: ]#020 TEXTMETRIC tmFont;
- ~0 S2 p* n9 Z#021 if (GetTextMetrics(hDC,&tmFont))! i5 O# D! e2 J8 J
#022 {
& B. M) x3 B( B( U#023 rcText.left = 10;4 ]/ W$ P+ Z+ T, J
#024 rcText.top = 40;1 S/ o. U6 `* Z0 |6 Y1 I
#025 rcText.right = 300;9 H4 S2 N- b) X( j
#026 rcText.bottom = rcText.top + tmFont.tmHeight;
' i- u3 _/ F: D, g, q( _) Y#027 }9 @) Z- S& u/ y1 K
#028 else9 n! X3 y4 v" X" R* S7 x4 f
#029 {" o. ]6 w; D8 U! G
#030 rcText.left = 10;
/ C) c1 Y1 {$ C" I#031 rcText.top = 40;
% x! Y, K% ~" ~8 L, O( x#032 rcText.right = 300;! ]) D& X# T5 j( |2 c& R
#033 rcText.bottom = 80;. y0 L" y. O; r9 a
#034 } a+ v, Q! u4 p: P1 X
#035 & N( G2 o h* R" {! P9 C1 {
#036 //创建黑色的画刷,
) g' l; _7 f) A+ b$ h+ ?#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));: w$ E8 O r9 n' z) Z, R
#038 8 u* Q3 ~" t7 f- P+ u
#039 //用黑色的画刷填充四边形的颜色.9 {2 X+ X7 M7 D" u( u; r# o5 \
#040 FillRect(hDC,&rcText,hbrush);
$ d. O' e6 u0 H; e+ w0 W; \#041 T, `0 p- e$ q2 q1 {4 S/ H
#042 //删除画刷.
- ]- V4 O6 D: p! { z% [& m#043 DeleteObject(hbrush);3 t K5 k' L! @3 l" P) Y9 B$ {
#044 & j# u- ?; c. H- N
#045 //设置透明背景
) y2 Q5 a5 I* B% `4 o& H$ {9 Q# @#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
7 C' @* [/ K' a' p2 n* Y# U#047 3 z' K( T9 v* e5 i3 m
#048 //显示字符串在四边形的中间位置.
* A6 r0 K T! N# ^0 j#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
8 u( A4 J9 w% D3 i5 T#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);) G$ @; O/ h4 i% s: i1 {# K
#051
4 I) P; T6 E0 E* ~5 n9 f+ j1 ]#052 //恢复原来的字体.7 ^8 ]& t) b; _/ I
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
9 H. L6 Z$ z* X+ T. A3 i#054 DeleteObject(hFont);7 f x- v5 J3 j6 Q! _, U
#055 7 ~9 D! u/ M: X! C+ _
#056 //恢复原来的模式.
1 B+ z" @+ f. p2 y% ^& e0 X#057 SetBkMode(hDC,nOldMode);1 p4 u; y. D* P0 e# A9 ^+ I
#058
: Z) T. _9 O+ k#059 //恢复原来的颜色. V7 }; J9 m. I& m l5 J
#060 SetTextColor(hDC,crOld);
7 h9 B; z1 G+ K5 ]; E0 L#061 }8 v! t/ O# M( m" N
#062 |