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

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

[复制链接]
查看: 2057|回复: 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& G' \8 \* j2 J, K/ D3 t, J
+ t6 ?. W$ f4 ^, C) B, d1 O, G0 @6 k4 z
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。: H$ k7 h8 |. u2 T3 L
6 _* m( y% M- c, p0 {
函数GetTextMetrics声明如下:
; g( V2 b! p4 a% D . j  i8 t, v" `
#ifndef NOTEXTMETRIC
) u' F7 @# f0 D1 C0 _8 s# X* E
7 Z! Z% A8 ?; [5 dWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
5 }7 r9 @8 i/ c" n" i4 ?: KWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
$ P  Z  F. Q& g+ A/ i+ v5 c#ifdef UNICODE
5 y- w3 o9 p: V4 \8 w" \#define GetTextMetrics GetTextMetricsW7 Q$ z/ |, Q' e! D: N3 X2 V
#else
$ h( X1 z; b1 I( Y9 K3 I! q#define GetTextMetrics GetTextMetricsA9 e/ `) G% @! O! S  u/ p7 Y
#endif // !UNICODE8 M) k* k7 @$ i+ P7 Y( o
9 }1 `' L8 F- W- Q7 B9 g! u
hdc是当前设备的句柄。: S% R$ }) W- f) F9 m
lptm是获取当前字体属性的保存结构。它的结构定义如下:
$ [" N, R  e# @0 g; H  Otypedef struct tagTEXTMETRICW2 i5 F; q) [& O) V/ v
    {$ N  A- \4 H( y: N  d
    LONG tmHeight;+ {4 h9 m# t1 y$ K/ V; n
    LONG tmAscent;& N1 I  W! W2 g* V0 Q3 p
    LONG tmDescent;
" p9 H3 E7 Y6 Z$ z$ r! F    LONG tmInternalLeading;* E. [% D5 ~* @/ T; h+ K
    LONG tmExternalLeading;
0 [5 j6 K' r8 o+ `    LONG tmAveCharWidth;9 H/ J$ g5 B, H& U" L
    LONG tmMaxCharWidth;  `; g- W, X) |7 \$ G: j( Q
    LONG tmWeight;/ X. h, U+ v- S: t4 O& K/ a
    LONG tmOverhang;0 F5 A! q, {$ ]% M
    LONG tmDigitizedAspectX;
. m! |6 }' z% U: D) i+ N* R    LONG tmDigitizedAspectY;
7 f+ A( v" q0 X4 Y    WCHAR tmFirstChar;. r  x* o( R' M' C9 {" E
    WCHAR tmLastChar;$ H+ L+ c3 r, Z: r" I; y
    WCHAR tmDefaultChar;
; N/ g& U0 f4 B$ w5 h2 `- z    WCHAR tmBreakChar;
6 L* ?1 k! S6 n! B$ A    BYTE tmItalic;" I4 e4 [1 m$ p* g4 [  @
    BYTE tmUnderlined;0 s7 B7 ^1 ?* |5 X  y
    BYTE tmStruckOut;* v; A$ L, y9 ^0 B
    BYTE tmPitchAndFamily;0 B3 H! T4 k4 R" `* H# w
    BYTE tmCharSet;2 k# q; x+ V' U. V
    }     TEXTMETRICW;
7 @5 [8 j( C9 ^# O% G8 p7 @
/ U& ~0 d1 ?  c4 U7 \调用这个函数的例子如下:
/ V1 o* A0 E. L# Q& b) S#001 //
9 o( h  `+ e9 M1 u* l& @: f#002 //界面显示输出.# y1 ]# u* N7 S: J+ r
#003 //$ @: z+ {- A$ X! i3 W
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
' i# [+ W- ^" _#005 //! s9 ^* y2 k0 {/ [+ k$ l
#006 void CCaiWinMsg::OnDraw(HDC hDC)
+ ~- i2 s+ e5 p( k, {# {, Y1 D#007 {4 |% Q! N+ Y( i7 H8 B5 D' A1 q
#008  //
- `5 n7 ^) F5 V+ q/ t7 B#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
. U" U$ G& W3 n2 e/ r6 C( I#010  
2 }6 M& l( j& J3 I- D" G#011  //设置输出字符串的颜色.
5 l8 T/ k- Q% T1 B' ~8 J/ t#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
6 _; n% v' M+ r' J#013
7 s- {9 p5 N4 w+ P7 R#014  RECT rcText;    0 c  m, d% Y# _0 g, E6 t
#015 1 q' `+ g, v1 C, z% M  n
#016  //设置新字体.' M3 Y7 r) B# [  U) j' B
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
$ V$ b' {: c, o& M#018 0 r0 v1 g. D( a+ r, R6 A/ Y
#019  //获取当前字体的高度.+ ]4 F4 e1 g# Y
#020  TEXTMETRIC tmFont;
& ?2 M& V$ s* B! g#021  if (GetTextMetrics(hDC,&tmFont))4 Q2 U0 r6 i' |0 R0 z/ R: V$ M
#022  {. c. q( }3 p: K  v" E  N' @
#023         rcText.left = 10;7 @/ q% f0 [' f9 \1 F9 M
#024         rcText.top = 40;8 {& A* b' r' r' G) V
#025         rcText.right = 300;
: E7 O) T4 C2 J3 C& o" |#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
* F; |' X7 q4 }; u#027  }
% ~& y/ @$ {: [5 N! r  u#028  else$ e" P. F+ T3 y/ I/ D  f1 o/ S
#029  {& D; m$ k  K" M# x% G' r) w
#030         rcText.left = 10;
1 D) ^6 ~0 I" J5 Q/ n, b/ `6 ~#031         rcText.top = 40;5 l' d/ d& w! _* v: C1 v
#032         rcText.right = 300;, R' c3 R" v  [2 i6 g" H
#033         rcText.bottom = 80;
% a4 {; v7 d1 x7 l: |% ]2 D  K+ u* C6 T' |#034  }
! s/ r) P% m* ^#035
& Z; }, s: w; Q& l4 ]! K#036  //创建黑色的画刷,
& [' u% |0 p3 R5 X" p. z#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));# o! B/ }- ^% a! d# c2 P5 j
#038
- q) r" v+ M9 ?2 {/ d#039  //用黑色的画刷填充四边形的颜色.1 K- x/ X* x: o  b6 P% A
#040  FillRect(hDC,&rcText,hbrush);" X% j$ L$ K) F. A, w4 {
#041
- p! X$ k) b. \: Q6 `- I#042  //删除画刷.
( r& n' Q2 I9 @; O#043  DeleteObject(hbrush);* |, v3 h2 ?% s, v/ E- }
#044         
: m! n, P2 r% m' i( c" S#045  //设置透明背景7 R. Q: U  I& z, c4 b6 t4 n# S  e
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);5 A5 |: Q! C; x' s3 _/ i0 X& N
#047
2 J/ l3 {- B) B#048  //显示字符串在四边形的中间位置.
1 D$ {+ v+ l0 _' M2 T#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
6 W) R/ ?' D8 _; e#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);: o/ g2 i" L1 p5 b& ]2 w
#051 4 Y* R; }9 s2 f/ N4 z
#052  //恢复原来的字体.2 W2 u" `# {8 h/ m! E4 s5 b
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
  Q, Q1 q! |/ _8 n7 k#054  DeleteObject(hFont);2 E) |$ C0 D  |
#055
% |4 _& Y  q5 o$ E1 A: r#056  //恢复原来的模式.( n6 c9 H4 c: H: _1 _7 r0 Y
#057  SetBkMode(hDC,nOldMode);
  C# [) y4 k" q, B3 N6 P#058
) W7 V2 E' o% H$ P. Q8 k0 ]#059  //恢复原来的颜色.
( R/ j3 m& W& H! A, g) J+ c#060  SetTextColor(hDC,crOld);% h4 G9 i5 c% S  E& d
#061 }
5 H8 `: t- A% S/ n5 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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