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

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

[复制链接]
查看: 2051|回复: 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
. O/ q2 S1 E/ r) ]6 G6 g
; G6 n; l  R8 P0 a& a
1 U/ B/ S/ i2 {* [  ^在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。. w) Z: |3 P. n) X  d( N! o

& `* u: J" G) ~+ ?- ^函数GetTextMetrics声明如下:
; y4 ^5 O$ o! C- d' F5 r0 o7 o  s
! u) z# x, U& g+ L- D$ f7 Q8 j#ifndef NOTEXTMETRIC' T, X( d" D2 O% I9 E1 e6 R
/ d8 k: J. k6 F. q4 ~% ?
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
3 u4 a" X0 B) b+ A9 ~1 VWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);4 r$ K9 I( o# Z5 F7 u+ n/ s! o
#ifdef UNICODE
. t  B# Y" Y' B$ o% [: S8 o#define GetTextMetrics GetTextMetricsW
' L' i$ T+ z2 d! P) `5 p* u#else/ w5 X' i- ]# {) s7 j  M3 D
#define GetTextMetrics GetTextMetricsA
: q6 D/ U2 F. `. S+ }$ O#endif // !UNICODE
1 A8 `2 m  g0 [* O
" H8 [$ [2 L* Jhdc是当前设备的句柄。6 y/ F6 P- n9 H% V5 \: w
lptm是获取当前字体属性的保存结构。它的结构定义如下:
+ E: z3 x, a! M$ }4 W. S% |( e& Utypedef struct tagTEXTMETRICW- }, M: r. J0 j6 `6 m. v
    {1 {: Y4 Y5 q* b% M& \4 ~+ y
    LONG tmHeight;
8 ~5 F% l7 ^& ]    LONG tmAscent;% d, o' S# v9 H. ~! ]0 y+ O1 E. H
    LONG tmDescent;0 x1 J' h3 U% K
    LONG tmInternalLeading;
+ O" s5 z; j" e+ X- M# T    LONG tmExternalLeading;7 t3 l1 h, h! o9 R; _6 y# V
    LONG tmAveCharWidth;2 Q$ W6 R2 f+ {$ a& c! [! u
    LONG tmMaxCharWidth;* U. p4 P- f8 D; a# X* d7 O
    LONG tmWeight;
# y3 D7 ]3 D: a: b2 Q+ Z    LONG tmOverhang;  g6 U4 q2 o# a
    LONG tmDigitizedAspectX;
* Q! s$ A- q" t5 w1 J    LONG tmDigitizedAspectY;! n$ N* M# B% d& z* `0 q
    WCHAR tmFirstChar;9 z) V* o( Y9 f% f1 [& r# S
    WCHAR tmLastChar;
1 O& C0 k8 Q1 h% ~    WCHAR tmDefaultChar;
, l0 u: {  I& d5 _- q8 |    WCHAR tmBreakChar;2 Y! A+ H, z# s3 z$ j
    BYTE tmItalic;
: c+ K! E+ p. P  p/ b    BYTE tmUnderlined;
" G" G) U! }  `" f9 q    BYTE tmStruckOut;
' w. \6 m5 i' G3 i7 j* D    BYTE tmPitchAndFamily;
5 S' b0 r& ^# M1 M9 z/ x4 b( g    BYTE tmCharSet;7 S8 ?9 f. t1 b7 P$ |
    }     TEXTMETRICW;. t& R' F0 q; h9 q
+ m/ g4 G* R7 @6 v
调用这个函数的例子如下:, X8 @3 s( F$ l- y0 [( D, s, Z
#001 //9 Z2 q' T8 S7 L2 V; N9 {
#002 //界面显示输出.7 O6 ]! Y0 c8 f
#003 //
$ \0 ^( r& M/ ^/ m; k. W! R#004 //蔡军生 2007/09/06 QQ:9073204 深圳* m6 p7 M' l' }
#005 //
2 |5 O7 X# {! `& g" l- ^#006 void CCaiWinMsg::OnDraw(HDC hDC)
4 E/ M$ ^) P: |% [3 ?2 M#007 {4 l  M& R6 F: k3 V. i/ h
#008  /// R" C/ j0 K9 \
#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
9 h1 u( x' l1 [- a$ o#010  
/ J3 i8 O0 y; C6 f6 {#011  //设置输出字符串的颜色.; \# {* r- k/ r
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
" T& C; [1 H. v9 y' R/ k#013
. b0 h. q  G6 x; b1 ^7 ~, f#014  RECT rcText;   
5 I  F$ H7 l* W( w" [2 k8 u#015 * s3 [4 D! ?$ t( c% s; `
#016  //设置新字体.  f8 a# b4 Y6 p( m3 @
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
- K2 B. _4 a$ s; C% I: [#018
) d  \; o$ f9 y: l4 X8 d#019  //获取当前字体的高度.3 }1 e  c# f: m1 \! }) O9 D
#020  TEXTMETRIC tmFont;9 A' c5 P' ]7 c* M* K  m
#021  if (GetTextMetrics(hDC,&tmFont))
6 W: {1 a6 e7 X#022  {4 X3 p7 ^7 I! ?# s+ r
#023         rcText.left = 10;
* e7 b% c* X; f* Y% e9 F! `- W#024         rcText.top = 40;
; c3 ]6 z6 e+ T#025         rcText.right = 300;% e8 L* Z; m9 {( t
#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
; T% u! [7 a3 U1 e, Y/ `#027  }
* B4 r) V* n2 f7 J#028  else
. W$ e: C( J/ V% e) c#029  {6 a, M9 ^9 u  y8 L0 I
#030         rcText.left = 10;
6 h! e% s# T! w1 i) f2 }3 @: u0 j#031         rcText.top = 40;0 {5 x; @0 m7 E$ M/ a8 s) L9 {- c
#032         rcText.right = 300;
, x; ]+ q4 X: q" ^- r1 T# ~5 I#033         rcText.bottom = 80;6 @  j! s& n& }# i  K3 I
#034  }
1 h  w4 v- v. l#035 " Y7 j* q' U# S0 v$ j; @! X8 h
#036  //创建黑色的画刷,3 J' Y' O& a. {( b! c' m, D, o) n
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));8 `6 w4 x- m2 `8 _, X2 U4 i5 U
#038 ( k; ]1 s5 W( W
#039  //用黑色的画刷填充四边形的颜色.
7 Y9 X* G+ Z1 j) B) S#040  FillRect(hDC,&rcText,hbrush);
) p0 w4 P0 V- m: f9 l2 [#041 9 M; G# r& q5 m6 [6 m' u
#042  //删除画刷.
& Y  i2 O1 x+ g( j#043  DeleteObject(hbrush);
( K7 N& `" e7 a8 v+ W0 A#044         ! ]- |; A! h+ {! F- \8 [' v) M
#045  //设置透明背景' ~3 `( d' C" P; U9 M. Q$ Z1 ]
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);, e2 M# E; Y: r% M
#047 3 ]# i" l6 b, H! t
#048  //显示字符串在四边形的中间位置.6 s/ W( C& f4 h3 d9 E' q
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
/ g4 _4 L( q  Y9 }- F  G7 o. g# E#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);8 o- w0 t4 O, R: u; A, U) e3 l
#051 4 R# I; }- v3 J( N* J% L( D' Z; j
#052  //恢复原来的字体.
: d9 d$ A7 C7 {$ s5 y: p6 {- [#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);2 O3 b) ~4 S8 w
#054  DeleteObject(hFont);8 _- W, S0 H% w" t9 V3 O8 y
#055 # ~. i+ i9 m) m
#056  //恢复原来的模式.8 K9 i3 ~6 {/ d, ~
#057  SetBkMode(hDC,nOldMode);
% M: d" x! w; u; I* m% A#058
2 r% C/ O* g9 ]& L* w#059  //恢复原来的颜色.
3 s+ a: s3 N9 c' ~#060  SetTextColor(hDC,crOld);4 X4 B* y! l7 k# f* ]
#061 }
$ H' b9 _  A, r/ P: j: O6 O#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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