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

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

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

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

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

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

http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx3 q3 z+ d$ {% j5 O

8 R% z* c9 a  E9 x5 C2 ~
, U% ~. q# E$ S* ?+ u& d( X; k0 g) A在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
2 X0 n+ T& d' l' O/ A# { * {% O, e1 ]: }& `+ A- D: b
函数GetTextMetrics声明如下:# `9 P3 }& ~( `1 `7 m9 f

% t- n6 K$ \' L. p; Y0 W#ifndef NOTEXTMETRIC* B6 U, p0 ~2 z
/ o4 i8 W- r& K6 I* f9 M
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
: y0 g) b% o. M0 J% t( QWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);% B! i; p2 x/ H3 X* ^! t5 g
#ifdef UNICODE. u* n( E% r6 U3 l
#define GetTextMetrics GetTextMetricsW+ B% T& ~5 u3 E
#else
0 I! \& F: ^4 `$ N; C#define GetTextMetrics GetTextMetricsA1 E2 }0 d- G- c4 ]/ _
#endif // !UNICODE
7 W* R! U! t( t/ r/ S! T  t, Z   W/ G' S8 J5 v3 m8 N* f; G5 C& F
hdc是当前设备的句柄。% F  c, B3 T' m  c( L4 _5 O7 F6 @
lptm是获取当前字体属性的保存结构。它的结构定义如下:
- {0 \, o; V5 T2 Ltypedef struct tagTEXTMETRICW
7 l* ^1 e4 b6 g7 j2 R4 v4 g% P    {  t( `0 ?( w/ d) u+ i
    LONG tmHeight;
  e2 a0 Z, ^7 Q" m. B. t* I    LONG tmAscent;1 ~% I6 O) v9 S% ^" d$ w3 ]
    LONG tmDescent;2 b9 U) k4 V' z* _
    LONG tmInternalLeading;
3 Y' Y9 w  A" O& W) ^* \* t    LONG tmExternalLeading;
1 q. g& E" g5 G3 b  O) y2 I4 G    LONG tmAveCharWidth;2 L! g; A, Y- V+ f
    LONG tmMaxCharWidth;, A; m  O- `7 h6 i5 z
    LONG tmWeight;" J. W; O) I( q1 g$ G
    LONG tmOverhang;# ~! v- J$ I# Z/ g1 v* l" w
    LONG tmDigitizedAspectX;
0 l4 `3 e1 w, i5 {5 G: [    LONG tmDigitizedAspectY;9 y# i. |) W% F6 F3 w
    WCHAR tmFirstChar;
+ w$ v) v7 D* p0 D    WCHAR tmLastChar;. A/ D9 p  O9 X/ A/ F
    WCHAR tmDefaultChar;3 A" H8 s  T9 L3 g! H- P% U
    WCHAR tmBreakChar;; v) H& L5 b. G$ n$ L" l
    BYTE tmItalic;
8 S9 p+ M& F' a0 s  p    BYTE tmUnderlined;
, S$ ?  ?: f3 I7 L& R+ i, g& n    BYTE tmStruckOut;5 C9 Y* t) y( A. v8 o
    BYTE tmPitchAndFamily;- w% a  ^; `# D3 h- u
    BYTE tmCharSet;
& N' y4 C- K  h5 t7 M) W" t) n    }     TEXTMETRICW;' D& u# e' U* W" v- q3 [
, T; V3 g: [6 e0 b# W# ~
调用这个函数的例子如下:
3 R7 h  h" a5 r/ A8 \9 d8 G#001 //
7 m2 M; s4 r2 N& f0 q) e2 g% }#002 //界面显示输出.
" Z) D7 p9 R, Z* d1 B% `#003 //2 T& A0 y1 c) P
#004 //蔡军生 2007/09/06 QQ:9073204 深圳+ e9 c. [0 I8 c! t; X
#005 //9 z7 Q1 b3 H6 }1 A0 D8 m
#006 void CCaiWinMsg::OnDraw(HDC hDC)/ y3 l# k3 {1 E# {6 i+ Z
#007 {. N8 H7 f* Y6 i7 B
#008  //0 X5 ^# O: s9 O$ x- ]) m& w
#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));: L, F- N8 G* u/ x( a5 [/ X' p
#010  % t+ h+ G% ?9 `' B9 l) @9 L+ D/ X, w
#011  //设置输出字符串的颜色.% n  @, p% O9 {% I
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
0 r8 O7 r: X& r! A' P3 ?2 ]#013 9 @+ }0 z# Z1 o% [! C, i' z7 j0 M
#014  RECT rcText;    7 g. b: ~' W8 ^4 u0 G- k
#015
6 e8 _$ f* ^3 s8 @, r3 n#016  //设置新字体.
  ]1 t9 Q) h! z1 _5 q#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
9 p- W* B/ c8 z0 K; m) I#018
. u9 S$ @1 S- J+ X4 k" r#019  //获取当前字体的高度.
" A9 h, ~( y# M4 k1 u#020  TEXTMETRIC tmFont;. l2 n$ d6 s0 C
#021  if (GetTextMetrics(hDC,&tmFont))9 f4 P, b6 M0 v3 B' F
#022  {% e5 b* t) ^2 E% \- T, C: z9 I
#023         rcText.left = 10;
1 V; t3 d, S! @# |* t& q#024         rcText.top = 40;
6 s; \" B7 ]) j2 S  b#025         rcText.right = 300;7 x% N$ w( t7 T: ]' i
#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
3 m( y$ t+ s6 _/ I#027  }
' |! B9 A4 d  r$ [. u6 _- s0 G" H#028  else
6 Q, r- v' L" z1 G$ b9 f  h#029  {: D" A; x8 J* ^4 X# t
#030         rcText.left = 10;
$ ^. r# E4 j% D" N5 {1 a#031         rcText.top = 40;
/ Z+ l) M6 _- O$ _( d! I#032         rcText.right = 300;
* @9 w6 g, E% X0 t1 ?#033         rcText.bottom = 80;
3 y8 f& G' {+ }#034  }
' Q) `% s' n) w. H' H; f2 o& N#035 7 B2 Z5 M4 n. Q
#036  //创建黑色的画刷,
7 L0 o7 I+ W9 G( p#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));# j  S; W0 J( N( s8 _
#038
" L/ t# V. N7 ]% E. ]) E#039  //用黑色的画刷填充四边形的颜色.
; A5 m) F& w  D+ M! a& ~; r2 @#040  FillRect(hDC,&rcText,hbrush);& L( g# x0 N! w1 l
#041 & O" l6 e0 L& I" X" z6 x$ c
#042  //删除画刷.$ J, W- a4 L6 B0 e- d! l
#043  DeleteObject(hbrush);0 c: E3 _" C1 z1 a
#044         0 R4 k7 a" L4 Z: @. D
#045  //设置透明背景
" n! O/ ]5 p2 k$ X! ~#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
( g/ t# V# U! l# E# M#047 7 }/ |2 @9 x8 y
#048  //显示字符串在四边形的中间位置.
: I8 Y( J" l" l5 w4 d7 t0 w. k: F#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
& O% a- G) h2 @" q7 C  O#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
4 r. w2 u! e' X- l3 t. w#051
7 X+ Z' p, O. V) n#052  //恢复原来的字体.
) o  B! L. |$ W) x% M- {. A#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);. \; X6 t/ p6 E. |
#054  DeleteObject(hFont);
$ E/ M1 I$ z2 \6 x/ a, f#055 : X* X! l: @; ~7 v
#056  //恢复原来的模式.+ @. c7 U- J6 n' e6 q+ j8 w, ?5 C
#057  SetBkMode(hDC,nOldMode);* d  e1 l' c( C* B0 q! i
#058 ' V% X: G9 @; Y- @
#059  //恢复原来的颜色.3 s9 Y' ^7 W/ n
#060  SetTextColor(hDC,crOld);
# v# o8 t& a' A#061 }& }7 Z+ i, S9 l* {* G! ^
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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