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

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

[复制链接]
查看: 2031|回复: 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
4 G! j) d+ u+ \, M4 Z3 e5 @$ I
, L& o- l- d; Y( {8 p$ L0 `9 Y* r6 P6 i. [- Q+ T
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
+ v/ m3 {5 R7 H8 ^# W. j9 _ 2 z7 C. t+ a* g* O
函数GetTextMetrics声明如下:- u2 M. u- e% G" j' s4 s

7 ^: S/ b( @9 T5 s#ifndef NOTEXTMETRIC
- _, m( O, S, v  K2 X# j: w) Z, | $ A, g3 h9 Z, M& \, e
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
% W' Y# [- w3 K7 b; h7 bWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);  _4 o# D! R" y$ e
#ifdef UNICODE
: L& _2 |) L0 y0 M#define GetTextMetrics GetTextMetricsW% T& ]% |7 ]1 B, u; O
#else. J8 n, @/ C$ C; W$ B( t# L: u; c
#define GetTextMetrics GetTextMetricsA
6 S0 Q; R+ k& q1 Z8 g; g5 _: V/ T#endif // !UNICODE& r& ^, @% R* ^( U- C) w' ]
5 O& @$ S8 a* ?" z/ A; w/ f
hdc是当前设备的句柄。
& p" W# p- q  ]lptm是获取当前字体属性的保存结构。它的结构定义如下:
7 o3 C2 T* y. T- [) Atypedef struct tagTEXTMETRICW
, M) U* k& k4 i+ g+ P    {
. K# {# \1 A: \1 h9 p, ~# [, P    LONG tmHeight;/ e+ G; k, w8 W2 P5 a8 c  t' m1 F
    LONG tmAscent;
; T+ @: ?' k0 T6 w8 N. L' F    LONG tmDescent;5 \) Q( e, j0 t9 J
    LONG tmInternalLeading;$ i" |7 R) b' N
    LONG tmExternalLeading;
; G* u4 v" w4 z7 e    LONG tmAveCharWidth;8 M6 y' _: g# x6 X! q6 a) b
    LONG tmMaxCharWidth;
8 F, e# y+ m5 [/ X. E5 S$ S7 c    LONG tmWeight;! @/ `7 z6 g0 j8 G
    LONG tmOverhang;
/ |% b, W% c5 V% P0 W7 I; V! c    LONG tmDigitizedAspectX;
; f9 W  f& k. m* t9 e1 }    LONG tmDigitizedAspectY;  o2 m) R6 Z/ o2 l; b1 U
    WCHAR tmFirstChar;7 d+ q  Y3 [, }) A% r' H, w
    WCHAR tmLastChar;- ]' _1 ]: F7 b! U5 K
    WCHAR tmDefaultChar;7 U( Q, A- P3 U3 |3 j2 o+ I: L
    WCHAR tmBreakChar;
, Z' T2 e' K2 h% i+ q    BYTE tmItalic;
9 I- v% I' N7 `7 X! p* w9 T- T    BYTE tmUnderlined;: Y9 ?6 C  E& O& e
    BYTE tmStruckOut;
& P2 s4 a- G* b, {# C1 c    BYTE tmPitchAndFamily;
: M8 _$ m( O2 G8 {) p7 A( `    BYTE tmCharSet;3 Q! \9 P. T) G  x
    }     TEXTMETRICW;
8 I* f1 G* ^. l3 c" g( ?
! s  ?/ v1 E8 i$ t* _调用这个函数的例子如下:& }! n9 \+ m0 S9 G
#001 /// F: l: b& O/ ^, B, `& D$ x
#002 //界面显示输出.# [2 h( _& Z2 W! V* y
#003 //
; ?& S  ?' Y' F# s$ q% n+ E#004 //蔡军生 2007/09/06 QQ:9073204 深圳$ m% D+ c& @- e' R' @% Y. U
#005 //
/ [) P& R5 v7 Z; t/ W6 _% K#006 void CCaiWinMsg::OnDraw(HDC hDC)+ n; J4 y  D6 _9 a6 p/ A. R: I4 @
#007 {: \; m7 ^' H' a6 N& ]
#008  //
( Q7 g, }1 {# d$ S# _6 }$ o#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
- z; G: s9 V2 X#010  7 ^/ w3 p& f! C0 g
#011  //设置输出字符串的颜色.  H) e) |* G+ B/ t) ?/ n0 S8 [3 ~' Q4 w
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
; ~7 U, g' s- `2 P/ F# c" Z  f4 E#013 : j1 [# l/ \" M+ R4 O, @* N; ~& e
#014  RECT rcText;   
, Y. k9 Z. J, Q7 c7 Z( @#015 , ~4 Y# [9 s3 D4 l) [. y% H
#016  //设置新字体.* S1 U( c1 D- }7 W, A# N" V
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
' ^1 @' w2 R9 O, y#018
1 D' T3 j# n* D0 X/ t! i6 E#019  //获取当前字体的高度.4 f2 H1 j- X- s3 `7 o8 S3 u3 O
#020  TEXTMETRIC tmFont;! D1 L7 }+ n8 a, j/ |' Q0 Y
#021  if (GetTextMetrics(hDC,&tmFont))7 c! {4 N% x9 u0 c/ q3 F! ]- [
#022  {0 m! I' O" f0 n; r8 _  [
#023         rcText.left = 10;
# b) a& }* g9 G: X#024         rcText.top = 40;
. h' e6 j, m4 k. j7 N- U% d/ }#025         rcText.right = 300;
# z5 o5 M3 L) _; P  O- i#026        rcText.bottom = rcText.top + tmFont.tmHeight;    9 J" C% x2 b( e' q
#027  }8 t% V5 k, y! z5 P! @  i
#028  else
: o/ q: {6 a' ?0 F8 I' q3 Y#029  {
7 s% [8 N$ t9 B7 e6 X( n#030         rcText.left = 10;
5 ], Y$ P0 {# V) \" D8 O# m#031         rcText.top = 40;4 N9 D$ Q# G6 x/ A6 F
#032         rcText.right = 300;
% e9 m$ |0 @8 l; U#033         rcText.bottom = 80;
$ E( U+ p% K6 e) y+ ~#034  }
2 P) f( G# c4 S8 K6 p5 y#035 ( w. Z- d- M+ r. A& a
#036  //创建黑色的画刷,8 E7 A$ q# k) Y9 }0 k5 i& r6 ^
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
6 ]0 c+ q! i+ Z+ \) K#038
& V+ a) \( J7 L) k#039  //用黑色的画刷填充四边形的颜色.0 m/ w! D( M4 i$ l) C% w. H
#040  FillRect(hDC,&rcText,hbrush);
0 R' j8 N, _3 O% P3 p7 _9 J) Q) i#041
- u/ Q  s. L) e3 a! y2 X#042  //删除画刷.
& u: @: A7 R6 @) K#043  DeleteObject(hbrush);
% ]& y: ^2 Z$ _) z1 S- |#044         , e/ t) J+ ]) E. a: d0 o4 s
#045  //设置透明背景# j  Z0 j8 Y9 w9 Z8 c: H
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
- W2 `" S6 {4 X#047 6 P- t! A! \+ ~
#048  //显示字符串在四边形的中间位置.. E6 |/ C8 _, {6 z. |" r' W: p3 m
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
" n* ~$ M/ S; I2 _5 Y#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
! N0 }5 c0 R) i# j$ {7 n  M: o#051 ) K+ a& d" D* |4 {/ V' K1 }
#052  //恢复原来的字体.
) N% }9 l- O% z. H#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);5 p8 }5 K9 [- {) k! |
#054  DeleteObject(hFont);& r6 L1 n" ^$ Z. E3 h8 a
#055 4 o# {: R3 ]! K- p
#056  //恢复原来的模式.7 ^2 q, }. g, G1 ^0 t0 S
#057  SetBkMode(hDC,nOldMode);! a% x! z7 h6 e1 @& v' a7 |' O
#058
  E' W+ @6 B  |, Y  u. b#059  //恢复原来的颜色.9 E& v" b* x( D. D
#060  SetTextColor(hDC,crOld);5 C' ~: ~6 R3 Q2 F
#061 }/ v( ^5 f- A0 [: S$ M; Q
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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