设为首页收藏本站官方微博

【汉化资料】Windows API一日一练(30)GetTextMetrics函数

[复制链接]
查看: 2062|回复: 0
打印 上一主题 下一主题

【汉化资料】Windows API一日一练(30)GetTextMetrics函数

跳转到指定楼层
楼主
发表于 2009-1-20 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】Windows API一日一练(30)GetTextMetrics函数

http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx! K! K) F5 w! L  I8 h1 Y" F
2 n2 _. u' h1 v$ X$ F$ }

2 @- Q5 V! Y, C' W3 {在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。& U% X1 s2 s* n: B( b6 O/ e9 \

/ I8 ]  h7 x6 v( Z) \& C函数GetTextMetrics声明如下:
! i. @+ o+ A! r$ K4 N1 E, Y, S" I 9 r( f3 h3 `3 s& n$ ^1 y
#ifndef NOTEXTMETRIC4 \1 C# ?) Z5 W% f& S4 _" N

1 G; S- h  @. C. r5 o7 U6 V, ZWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);) G" p) |- z( b* u/ A1 Y  t5 ^
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);: }3 ^5 E6 m  ]: _/ L
#ifdef UNICODE
# Q" }. E7 x9 P  M, ~7 B5 w#define GetTextMetrics GetTextMetricsW" ~3 v& Z* v9 _2 E5 `5 y
#else0 r  N+ y, v; p  i9 G
#define GetTextMetrics GetTextMetricsA! Q( Q+ @( z. }7 h6 q" j
#endif // !UNICODE1 p9 O& Z+ y6 k8 U% p
* m' p  W  t/ b% p; C
hdc是当前设备的句柄。1 u$ P8 }/ }6 v9 R
lptm是获取当前字体属性的保存结构。它的结构定义如下:$ r2 j! ?7 ?2 P) L9 s
typedef struct tagTEXTMETRICW
# {1 E& ?5 F: @7 S    {
, i3 h! B1 V& B. M9 Q    LONG tmHeight;
% |: A+ U! t+ C/ J1 C9 K/ R    LONG tmAscent;4 j# z8 G9 ^* D1 F8 O% P9 `
    LONG tmDescent;
. M  o/ i, r2 [) M% {3 o* ?0 H" |3 l    LONG tmInternalLeading;4 U, b; q4 h- f2 \9 z0 K" e/ w6 l5 f
    LONG tmExternalLeading;* g3 N1 S9 ]! {3 s- S
    LONG tmAveCharWidth;
; O  |% R+ Z0 c" ], \    LONG tmMaxCharWidth;: L; G5 Q# H3 O# D# X0 d. P; C- m
    LONG tmWeight;
! a: R  e* e! Z    LONG tmOverhang;
  \6 @9 I; U* t) }2 m    LONG tmDigitizedAspectX;
! d' G; e7 Q( s# i2 n4 y    LONG tmDigitizedAspectY;2 S# h- [7 `8 \( L# }% e
    WCHAR tmFirstChar;" R4 b+ @9 S9 z' f+ k9 |. j
    WCHAR tmLastChar;1 [2 ^( K& Q8 t( p) G+ [
    WCHAR tmDefaultChar;
3 s$ B9 ?- A8 I9 Q, Q3 N8 R; U    WCHAR tmBreakChar;9 e# A8 t+ k  v1 x1 x: R' }
    BYTE tmItalic;
  K. g- G$ _" A. b! I$ Y* X    BYTE tmUnderlined;
8 }5 u7 b- H9 L! H. N8 e( z    BYTE tmStruckOut;# c( K7 j( p% z/ a
    BYTE tmPitchAndFamily;
  V- ^- Y' |4 w; W1 d/ w7 d* k    BYTE tmCharSet;
. U$ K/ U  i3 l+ _( m3 i# {& h    }     TEXTMETRICW;
4 m8 H- k- x- k; P; L
) t* F" T4 i2 {( ^, O7 F1 t) W调用这个函数的例子如下:
6 G2 g$ I+ h5 j: \- J#001 //) z- c9 G" J1 V$ y' Q0 N/ \1 v
#002 //界面显示输出.  X7 Q" M4 e# S3 ?, B9 G8 S/ M2 [
#003 //) J, H( Y5 ^( Q! Y0 N; V
#004 //蔡军生 2007/09/06 QQ:9073204 深圳! L* v( U3 I  n+ K; ^0 d
#005 //# p( f5 F7 n$ m$ L1 c
#006 void CCaiWinMsg::OnDraw(HDC hDC)
  c5 K1 m, ]8 U: a#007 {
7 q6 Y7 I0 }% x: Q. P#008  //
5 }$ c: x# A9 E' A* l#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));4 p# k8 p0 }0 t3 n
#010  , N' s2 q3 J2 L3 m
#011  //设置输出字符串的颜色.4 c2 n3 ?. ~, f, @2 z- R, ]9 a1 Y
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));6 X) x: V3 F! x. V+ ?/ y( S
#013 / A4 W4 f2 K7 u
#014  RECT rcText;   
- _- n( E) G4 Z, y- l  @: K#015 # [1 X3 B6 U( }! |  g
#016  //设置新字体.
9 Z1 {. }2 w. h, D#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());  s* P9 d/ `$ l' }7 t  q" f' ]2 v
#018
5 s4 P+ ~* m/ a/ E: |- x' L#019  //获取当前字体的高度.
  E3 ?" y  Q* B. y* c#020  TEXTMETRIC tmFont;
$ X. M  F6 Y3 ]! i1 O" D; r! k: C+ e# Q) [#021  if (GetTextMetrics(hDC,&tmFont))& x/ P3 S% M# t9 W/ L
#022  {
6 |4 l8 K9 O( G. n* S! ~& o#023         rcText.left = 10;
0 H3 h0 D! ~2 ^! o9 w#024         rcText.top = 40;
% }. E8 Y- C4 I#025         rcText.right = 300;5 W/ \3 `- d2 \5 L! y' w( x
#026        rcText.bottom = rcText.top + tmFont.tmHeight;    8 d5 H" Y8 n0 [/ i+ W4 W) ]( K
#027  }
1 x+ P7 T) Y  A4 v0 o7 F#028  else) D- x/ A$ F, t2 T  u. G* K
#029  {
" P. a# P) n# l0 `0 C#030         rcText.left = 10;% C$ \* ^. h" }# T
#031         rcText.top = 40;
+ U9 B8 ^' V7 Z/ w#032         rcText.right = 300;
4 S0 W) q* Q: i: H2 u: c& g#033         rcText.bottom = 80;; N" o$ u7 Z. N1 \$ t9 d( G
#034  }
0 P4 e2 @! J' Y  m#035 , f2 R2 D% p! \8 c& W8 v* J
#036  //创建黑色的画刷,
( k+ P: E) K% O8 r2 b: n#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
, P) E4 C5 H( o) ?( J+ \6 k#038 + ?) V$ F" ~& ^. D
#039  //用黑色的画刷填充四边形的颜色.
$ O! e1 h% B6 ^9 d#040  FillRect(hDC,&rcText,hbrush);
) r2 t1 ?3 Q8 E9 P& o#041
" T. G2 p  e& G0 a2 B3 A#042  //删除画刷.
) g0 _; f( e/ y" V: ^/ |) K#043  DeleteObject(hbrush);
" Z) @4 k" s7 F/ m1 w2 a+ U$ H- Z#044         
( |; a* U' E) o5 ]9 b#045  //设置透明背景9 z3 ^+ n/ I2 J1 L0 Z, ?
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
$ J& ?; w" n0 m* P; X#047
; m: a+ [5 [. m# r#048  //显示字符串在四边形的中间位置.1 G- b4 e9 u5 J; z
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
  o6 D+ e: W/ p' _7 y5 M#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);3 ~5 ]/ ]5 D3 b  t* r
#051 5 M* S$ N* d' q2 m
#052  //恢复原来的字体.8 @5 a2 M" _' ]) Z7 n
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);; W& h/ ?9 i+ o0 l: A- j
#054  DeleteObject(hFont);
9 d1 R) i. }) d#055
& }  V; e8 Q) b' R% L#056  //恢复原来的模式.' j8 i8 V% s2 G4 K0 A, [) d
#057  SetBkMode(hDC,nOldMode);& C: I2 x9 p. Z2 I6 W" X0 o
#058
5 `4 ]5 c4 n# T; G" i1 F5 T#059  //恢复原来的颜色.
3 c% L/ M1 p9 k#060  SetTextColor(hDC,crOld);" U/ E4 y8 g5 a0 m( M- d
#061 }* i. j. }2 q! p* j
#062
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表