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

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

[复制链接]
查看: 2063|回复: 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
6 L' J; h# \& U+ e4 C  k8 Y8 ^" D* }5 S# m
" N, b+ j$ T: X) J+ t
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。# i* K+ i6 C" a2 O" b

$ I( h: L# Q+ ]6 }# f函数GetTextMetrics声明如下:7 R' ^# `8 ?0 k; Q' T* X

6 O3 W& K, x( v% r  A) o' G% q  P#ifndef NOTEXTMETRIC
0 Z6 n- i% b. E& _* g9 K  W
0 P; g6 S+ e$ b0 o% B. E! tWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
7 a9 J) _: I0 N5 v  LWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);+ J! o7 s: ]7 z
#ifdef UNICODE
0 N) D+ _$ O  D" u5 \( J2 U7 ^#define GetTextMetrics GetTextMetricsW
$ i" m) \2 w! W( e: t9 c% K#else
1 ?5 g! Q! E( v& B. T+ V#define GetTextMetrics GetTextMetricsA
* X3 s- H6 [9 R  g6 [" `5 N- U#endif // !UNICODE8 ?4 t: H- K4 K) t7 w  r! h
+ k$ m8 [4 A' B5 ~
hdc是当前设备的句柄。
! l: z  y4 S( z% j, xlptm是获取当前字体属性的保存结构。它的结构定义如下:* d( e4 |* v+ H& ]' T
typedef struct tagTEXTMETRICW: n2 N/ c! |/ n' H8 y
    {: y- _' A0 ^2 d6 O# ~
    LONG tmHeight;
3 X5 ^! P& D  N' ]8 q/ ?2 K6 B( C    LONG tmAscent;9 N1 A; Q5 a5 e# z- ~' S" ]
    LONG tmDescent;
! w) U' T5 L& e3 h8 w    LONG tmInternalLeading;3 n% _2 {0 u8 J' @; J: R
    LONG tmExternalLeading;
) F: G7 T) M/ C2 s: {/ m    LONG tmAveCharWidth;
8 ]  a% g0 T( c( e+ B) g8 w9 J    LONG tmMaxCharWidth;/ `) h. j# p# r9 a  Y4 \
    LONG tmWeight;9 }* P: c/ j' K! ]
    LONG tmOverhang;
$ w" V! Y1 C% Q+ p    LONG tmDigitizedAspectX;
9 f1 s9 {% {; R1 M& o# G# O+ e0 F    LONG tmDigitizedAspectY;( j% E/ m+ T$ n) G5 M
    WCHAR tmFirstChar;- [# M% f8 J* h4 c' ~3 r. \" v8 x
    WCHAR tmLastChar;
7 e) b  d+ j2 O0 G3 c    WCHAR tmDefaultChar;) n8 k! `0 m  O0 P5 @3 a
    WCHAR tmBreakChar;8 O3 E) S. O) {* L! e% F3 B( M8 Q
    BYTE tmItalic;4 L9 ?! [7 W, q8 M* z1 W4 C
    BYTE tmUnderlined;
! A( p7 W( y, |$ L- |    BYTE tmStruckOut;/ P7 S. d" M" F" ]) @
    BYTE tmPitchAndFamily;$ o0 G# q/ H! _, n3 c
    BYTE tmCharSet;
/ m2 Y  v9 j" r! ?: \- M    }     TEXTMETRICW;2 c& i# W( S/ ^( I3 K
1 y. A3 x0 H. G! d/ ^
调用这个函数的例子如下:6 s; B1 R! X2 j: E; s
#001 //
' }+ U; ~+ c& p) G3 X#002 //界面显示输出.
6 L4 E$ g6 Q4 ?0 ~8 z9 [#003 //7 I/ y9 d5 k" B& M4 V
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
' y1 c4 d" F  j, o$ D1 ], ]: i#005 //; E/ A* _  ~5 ]# q
#006 void CCaiWinMsg::OnDraw(HDC hDC)
) M3 K& ?7 p) R3 P#007 {
) c& [3 J. g; @9 G#008  //
7 q- W3 @2 w- w#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));& j- _# X- m/ M6 w" L$ _8 |3 j3 O
#010  
4 _& p& }- q. r' B( g7 v#011  //设置输出字符串的颜色./ ?+ m% V6 z' S* ]
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));' P3 y% J5 ^6 P
#013
# Q% o- y0 G8 U0 [! @#014  RECT rcText;    8 r; `! M( ]  \' F
#015
! n' F1 v- q3 G% b+ P#016  //设置新字体.
# r" O7 j1 A2 P! D#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
% k. {: K/ V; K$ X6 C#018
; P/ j2 p) k2 E9 i3 d: |#019  //获取当前字体的高度.
# ^+ N& h) ^5 s3 a& J2 q#020  TEXTMETRIC tmFont;
* S; T, R! s+ \#021  if (GetTextMetrics(hDC,&tmFont))
& a3 I4 N( a5 x' |' Z. Z3 K#022  {! L, @! e. K+ e, I
#023         rcText.left = 10;
3 d0 `. v2 O2 T0 c#024         rcText.top = 40;
/ V& y8 Z* D# c#025         rcText.right = 300;
+ g  o4 K2 Q" O& o  O9 T& V; s#026        rcText.bottom = rcText.top + tmFont.tmHeight;    7 g/ G1 r: J3 V1 o
#027  }
5 C" q* C1 t' Q! \#028  else; x' I9 X. B- @" F5 |
#029  {7 B" O- g7 x5 K
#030         rcText.left = 10;% c( t5 N# ~) r! T' a
#031         rcText.top = 40;7 j# i3 I6 E. l; E  \- d5 P
#032         rcText.right = 300;, q: c& @# C' R
#033         rcText.bottom = 80;
& \1 w2 `" T0 k6 C2 A#034  }( {2 h  n, k7 `  x+ I- u* m
#035
/ f  d" c# `# X4 O#036  //创建黑色的画刷,& D- Z3 [( q2 f7 u* P" G# a% `
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));$ ]* b6 p6 h) k7 L; m
#038
( E* P6 e- i$ ^* {8 V#039  //用黑色的画刷填充四边形的颜色.5 E$ R; B( x) ^  c' s. H: S* k
#040  FillRect(hDC,&rcText,hbrush);
) j- C# o% g# ^: k( ]1 h#041
2 l. Z& {' T: k0 e- P' o#042  //删除画刷.  r2 N1 W& M# K4 P9 v) X: I
#043  DeleteObject(hbrush);
/ H3 K0 C! ?1 R- r/ P! o# H- e#044         , a3 |. n2 g* b0 O  ]
#045  //设置透明背景
. E6 P0 I4 ^3 t1 P- y#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
3 g" N5 q0 n& }9 B#047
+ m' g! x* W3 W8 k% U#048  //显示字符串在四边形的中间位置.
2 j$ N' P9 w- G1 D& ?#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,* V* X5 @" B( L2 Q& E+ Q
#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);$ B1 P/ n* Q6 u6 G
#051
' Z. l+ r+ ]/ Z9 d/ \0 A# s/ z+ [#052  //恢复原来的字体.
# X( K+ `. G9 {9 m2 }% I#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
  K7 Q# u6 [' ]( k: K% _+ ]3 [#054  DeleteObject(hFont);/ ^+ f$ ~/ A7 e6 r' \
#055 8 k1 i% U7 }, L8 S* b! v
#056  //恢复原来的模式.# t: d9 T0 F1 B; g4 d$ F
#057  SetBkMode(hDC,nOldMode);, f' {5 f5 P: S, c% S3 H
#058
3 f6 Y/ W6 c2 E4 z/ Q; I# H#059  //恢复原来的颜色./ M" `8 G4 g% r
#060  SetTextColor(hDC,crOld);
' q* W  l7 v0 S4 S# X9 v: G  S( m#061 }* j% \& P4 H1 }( F1 [0 o9 d
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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