冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】Windows API一日一练(30)GetTextMetrics函数 [打印本页]

作者: shane007    时间: 2009-1-20 20:48
标题: 【汉化资料】Windows API一日一练(30)GetTextMetrics函数
http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
& @: G) [5 M. B7 z, ]7 b
$ f6 i+ |$ [. p+ ]5 s
/ ]/ ?5 A2 C8 N4 f- T4 [0 B在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。) {1 N- F- G" i0 @8 B6 X
0 ~6 U* T  t2 Q: J8 L. Z& a
函数GetTextMetrics声明如下:
  _7 g% ]# d2 Y  ^9 L6 v1 v
8 B; W* V, l, [& s0 O#ifndef NOTEXTMETRIC
5 m& s/ {; b6 c" Y+ X8 P% [. s  v4 k  E # d( r6 V# G# @
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
" F4 A- S. o/ C3 R0 MWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);' ]0 L3 L8 X' b
#ifdef UNICODE, F3 K0 X* {! g' n, O
#define GetTextMetrics GetTextMetricsW
# X& \0 S6 Y2 v- V6 O: H. s#else
2 J3 k/ ~( V$ S0 n#define GetTextMetrics GetTextMetricsA
7 t$ m4 n/ i$ j1 a- r#endif // !UNICODE: r' N5 ?$ m; C8 b
! }  s3 K" v+ ^# ^) \; l
hdc是当前设备的句柄。
# N) Y% b' ?5 Z0 @/ H6 mlptm是获取当前字体属性的保存结构。它的结构定义如下:% T5 o" M1 ?! |( {% M$ N0 a' d
typedef struct tagTEXTMETRICW
- w( G% n5 g" k6 |' y. W    {
  T0 I& S9 M* b  l" \    LONG tmHeight;
3 I; j  D# a" `$ {  }    LONG tmAscent;& ^3 b& N6 U$ K+ W5 R# }& Q# V& C
    LONG tmDescent;. a+ X3 b" G! g/ R. u$ _% G
    LONG tmInternalLeading;. f% X2 a* Z# s* Q8 w& w
    LONG tmExternalLeading;2 i# ]; Z# I" t" I- }
    LONG tmAveCharWidth;- `7 A8 Y, v8 g
    LONG tmMaxCharWidth;
8 k; P# J: L# d8 a6 J    LONG tmWeight;: Y# }7 \- q; \! Z8 q8 a
    LONG tmOverhang;
: m  A6 w0 K$ O* D& D$ [0 o1 ]    LONG tmDigitizedAspectX;( Y( u' d8 i, A' M0 |8 _
    LONG tmDigitizedAspectY;7 A! Y# C, q6 `0 p, S1 g
    WCHAR tmFirstChar;
0 ^9 c5 f7 L. ~) X* k8 _+ `    WCHAR tmLastChar;
- H# G& j; y, d7 ?* P    WCHAR tmDefaultChar;
2 o( z+ |$ p9 n& K$ \. D: c' ]    WCHAR tmBreakChar;
' n- r7 C6 _8 H2 _! r2 R    BYTE tmItalic;
/ h& y- {4 \/ |* i4 B; Y( S, E    BYTE tmUnderlined;! C8 a" o3 e9 P6 ^" i
    BYTE tmStruckOut;
9 \+ ]: X% v) r0 g7 a    BYTE tmPitchAndFamily;
+ @  B% h; |! |1 K5 Q    BYTE tmCharSet;, e) ?5 Y. j2 {7 _, v, A
    }     TEXTMETRICW;
8 j2 Q% t% z6 l9 j6 ]5 h" V
# I8 W" p% ?6 M/ C( `调用这个函数的例子如下:) O! u8 _6 x9 u2 R: h1 S( s
#001 //
" U/ g2 P0 y# D% G8 L6 M#002 //界面显示输出.2 ~' w" J0 G3 b9 m; A# S' N
#003 //
. {( r3 S" d/ L#004 //蔡军生 2007/09/06 QQ:9073204 深圳2 C- x+ v6 B) n; U
#005 //& i! Z7 w; K8 u5 k9 {! l9 A
#006 void CCaiWinMsg::OnDraw(HDC hDC)6 x/ }9 i' l* ^9 f
#007 {! R; `/ W* k7 N' [
#008  //
- L. D3 d: R/ Q#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));0 F8 b) j3 L/ P: q" s
#010  - R8 R" O3 E. X2 k
#011  //设置输出字符串的颜色.9 E* i4 F( n! N+ Z8 B  [# X. k6 P* [4 Q( A
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
; I5 m9 C  M8 g+ _#013 ( c* z9 g+ ~1 C  a
#014  RECT rcText;   
4 I  |# c8 A2 v, v6 _; Y6 j#015
% ?! \) i; `" }4 o- @#016  //设置新字体.
; N2 x2 m: ^$ {$ G! Y. ~) f4 p#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());8 L1 X* u, o: v. \4 i% h
#018 1 d% _5 v3 M$ L! E
#019  //获取当前字体的高度.
& [7 U+ a# \6 G+ i# s( b3 R4 l#020  TEXTMETRIC tmFont;* m* ^; X+ C/ ^0 f" @
#021  if (GetTextMetrics(hDC,&tmFont))
; L5 Q: q. x% O& T/ I4 {' V#022  {: S: H2 ^, q$ T$ z
#023         rcText.left = 10;0 d+ s. N( W  N2 U% N" l
#024         rcText.top = 40;
/ {, M- G, k) B) P6 e, j#025         rcText.right = 300;
9 o2 [8 Z$ B5 N$ t- p+ f4 {6 M#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
3 e) R$ W( E7 u0 Z* U#027  }
. t- r8 v2 P  [#028  else2 s' R7 C& h5 o4 ?
#029  {
! x( \! ^  E: v3 i' p' o#030         rcText.left = 10;
; x. W3 I0 m, H$ W6 c: O  Z#031         rcText.top = 40;) Q$ }: U* V* s; n. P
#032         rcText.right = 300;
) {' V5 S) s& N# h, ]- g5 Y#033         rcText.bottom = 80;8 g" c! C3 K( ^3 V& {
#034  }
$ `( {5 w5 q) J3 a# V9 D' }$ \#035 0 K& i( ?  f( N: ~. f+ X
#036  //创建黑色的画刷,+ t- |/ u1 |) d& |( w4 X0 Z
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));; i, f+ ~$ t8 V, `$ K
#038
  @5 j7 @$ o6 ~/ E#039  //用黑色的画刷填充四边形的颜色.
; W% h8 N7 P$ a) c1 X% g5 @#040  FillRect(hDC,&rcText,hbrush);/ u. G% f, U, T1 o' h
#041 ( }4 ?3 D9 z6 c6 s
#042  //删除画刷.
0 f3 f; E3 f, l+ |. _! X#043  DeleteObject(hbrush);
; |+ R8 ^  Z5 g% V: Y: i2 X& ^#044         - N6 S. l6 z; ]% J* J
#045  //设置透明背景
: u$ M8 U1 X% v#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
9 `6 E8 m3 b7 E7 }. D7 f#047 # H$ y! i5 C  G( L9 v4 e
#048  //显示字符串在四边形的中间位置.* ^4 R& p- \& N2 B9 `; |7 {2 r
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,: ?) }3 U8 C% p2 \2 }2 I/ q
#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
! h6 ^( J/ w! m#051 $ N9 Y4 b# T- w7 Z# E
#052  //恢复原来的字体./ Z/ V; e1 n6 V, b
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);' o8 s! I! V  G* s7 v: x
#054  DeleteObject(hFont);
  p# k  F$ G5 y& Y#055
9 @& _: a6 x( L3 K2 \#056  //恢复原来的模式.
4 i, G$ ?. I: l2 I#057  SetBkMode(hDC,nOldMode);
; D( f+ A  @' E& j3 J# X! B#058 ) @  \/ J2 i6 g' P6 D
#059  //恢复原来的颜色.
- \$ b% P# m" [5 E' R9 i#060  SetTextColor(hDC,crOld);
( E5 J4 ~% s4 Z3 }; g0 x! x#061 }* l. ?: P: U; E/ g* K
#062




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2