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

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

[复制链接]
查看: 2060|回复: 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
& y! Q. Q1 s4 q  M0 a3 e3 ]9 ]0 T3 J2 ~; H4 Y8 F0 l
2 v, T3 ^% x" f
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
0 w* s: r6 E. B3 [; A! J' @
. z, G0 _# G7 _; }) G3 w函数GetTextMetrics声明如下:# O$ s, y) i& h& L. ?* d

# N0 h( L* A: J' V& ^# P#ifndef NOTEXTMETRIC
1 ~& q" e4 n/ J
! A) z8 S9 d  ^* y; jWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
) G' P4 w; Y* \WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
4 ~6 j. w( `  [# Y# {#ifdef UNICODE
# x" @( j7 i$ `7 z# n0 a#define GetTextMetrics GetTextMetricsW
+ q: \+ B1 Q7 x8 X' y, ]) Q5 ^#else: }) {1 ^1 {- S1 L
#define GetTextMetrics GetTextMetricsA0 W- a, E8 L; X1 y  i9 B
#endif // !UNICODE" F. E6 H; u! Y4 ~2 [. [- y* ]: _

6 d1 v( ^8 _% x' v# s  zhdc是当前设备的句柄。
7 p+ g3 v! D+ x2 u3 `& _; {( hlptm是获取当前字体属性的保存结构。它的结构定义如下:* J4 S! n' J; N6 w- J4 I- i5 W
typedef struct tagTEXTMETRICW
7 |# Z) ^+ J. b0 {5 l    {
: K) b0 O. J% t! V4 Q# e    LONG tmHeight;
' X( G5 W: X& }% x3 w+ t. C    LONG tmAscent;
9 |' H  s$ X1 m! E    LONG tmDescent;# A5 E6 m/ |/ ?1 [) f" ~
    LONG tmInternalLeading;
6 T) ?; l: T) T; v    LONG tmExternalLeading;
/ P& r4 [5 Z/ j2 n5 f% d' t7 s    LONG tmAveCharWidth;
* v' T: L3 k5 c. m7 T9 e    LONG tmMaxCharWidth;+ s- w2 U6 m( F
    LONG tmWeight;! b- i: t! r  q$ Z1 H# I7 R
    LONG tmOverhang;1 A9 m, I* E8 M
    LONG tmDigitizedAspectX;+ G+ @0 W% p9 K1 Q8 B+ R  ?2 ~* H
    LONG tmDigitizedAspectY;
1 ~" T5 d! A) B9 b) z    WCHAR tmFirstChar;
0 |* P3 u; J3 p    WCHAR tmLastChar;
" f5 j- m3 y# g2 i5 a5 S/ d6 d    WCHAR tmDefaultChar;
$ S9 I% l3 n! C/ \- e1 i7 P    WCHAR tmBreakChar;
) X% E) I  l" X2 n% S0 @    BYTE tmItalic;
2 l7 X0 z, M! Z    BYTE tmUnderlined;" P- ?) v1 B& y' m9 m
    BYTE tmStruckOut;' F2 F. q7 K: R( p& P+ d8 L
    BYTE tmPitchAndFamily;2 W5 `4 j$ k1 D" |0 V- g& d* n
    BYTE tmCharSet;
( e. C$ G  y5 d    }     TEXTMETRICW;; c0 _7 S+ l* k) n; X

/ b8 g) @" X" C$ Q3 G8 e# N调用这个函数的例子如下:4 {2 M3 S/ g8 n
#001 //
5 P$ ~1 L- v& U" B#002 //界面显示输出.
1 f+ H1 [0 |6 o3 `#003 //
4 M. A/ {- o: O" \2 U, ~6 v#004 //蔡军生 2007/09/06 QQ:9073204 深圳
$ a6 E: o" [, z4 [3 G1 ?3 w6 k8 w( P#005 //1 P/ Y2 L4 L) @9 E
#006 void CCaiWinMsg::OnDraw(HDC hDC)8 Y: m" e* o% ?4 h% p
#007 {
' A. O( R# A1 J. V; Y2 E#008  //
4 ^" b& o* P" x8 A+ Y1 K#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
/ v( j$ V; |9 M; n1 y; O2 A7 Z#010  / s  M4 ~9 s2 u1 a# C8 v
#011  //设置输出字符串的颜色.
3 F9 R$ D# k6 e. P  b/ P#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
4 c( I+ O% F  Y: A#013
+ F7 n7 _- M4 R+ x- `#014  RECT rcText;    . e% W: D2 M: o5 Q
#015
3 Q7 o+ I- `9 p6 o#016  //设置新字体.
1 Z/ O- j; g! G, ?1 |9 d+ O#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
% \% H; x# ~; s/ S/ v#018 % ~! ]) d9 r2 Y/ \+ P) M: S* m
#019  //获取当前字体的高度.
) z" `' i0 k9 S5 |4 O9 e3 ~#020  TEXTMETRIC tmFont;4 O) \9 M1 `3 j# |* Z- D
#021  if (GetTextMetrics(hDC,&tmFont))) h  z/ W$ z; @6 O9 N. s( ?" n
#022  {" V- f4 m. m: L
#023         rcText.left = 10;
7 N. q% M' g  }# y, O1 v8 R% p#024         rcText.top = 40;3 U$ t7 ]6 Q+ v1 V) Y
#025         rcText.right = 300;
* V6 [5 Y2 q# j- q! J) Y2 y& L#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
0 \" B# p: u$ R: f2 {#027  }. S( @& {2 |- x' I8 _+ O
#028  else
: v7 u5 e# e) ~* ]+ @7 _#029  {$ `: S6 M$ H; Q& T! [6 ]
#030         rcText.left = 10;# j* G% K! [' N6 o
#031         rcText.top = 40;
+ ~" o" S5 s! r6 O) U3 d#032         rcText.right = 300;
0 k6 a* \7 o7 @#033         rcText.bottom = 80;! p9 G8 R5 Q6 e
#034  }3 u* T( ~5 L7 g1 Y/ s
#035
+ P" l7 Z  z( U: x, F#036  //创建黑色的画刷,
3 {& H. X  ^3 U#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
- U& P6 ^$ K- D! \7 G# J6 }#038 # ?9 G' w1 k5 j  a4 q1 S
#039  //用黑色的画刷填充四边形的颜色.
: Y1 o1 @) L; s2 u#040  FillRect(hDC,&rcText,hbrush);) X: i4 s! Q. s1 h9 a2 I$ t  A
#041 7 j$ l/ R- n2 A2 E: W* f8 n
#042  //删除画刷.5 }) p' i" X/ ]8 d, T
#043  DeleteObject(hbrush);
+ I' U9 w" r7 j+ h4 D#044         
6 W$ t) h- X1 F, |8 @1 U#045  //设置透明背景
6 T2 T$ m) ~8 k. y#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
/ B$ M! t1 `. m$ a5 a#047
4 f; R+ Q( N% t4 |# E5 X8 ]% E& C#048  //显示字符串在四边形的中间位置.' p5 a' ^# e4 v3 v5 a* K
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
$ @$ J# p8 P9 e  v4 ~; |#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
1 O! O. x5 I+ j: [3 x#051 ( k9 t7 m" F' s" G
#052  //恢复原来的字体.
4 r% Z9 W* D7 E- d4 v#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);8 F3 d' q, E! h% [0 T
#054  DeleteObject(hFont);& F( {" v4 z4 h% G+ s# U! }& W
#055
  a/ \6 ^, G7 j' k1 H( I#056  //恢复原来的模式.5 s. x, X" |4 a4 d% E
#057  SetBkMode(hDC,nOldMode);3 F9 L) }6 ^" @8 h
#058
& H! r& r$ ?& s  g#059  //恢复原来的颜色.
! V  V% h) x0 }" J/ K6 }% u#060  SetTextColor(hDC,crOld);
9 z7 e0 O; \6 p% B3 ~+ f4 W: \/ R#061 }
$ n' o  B2 O  c  Q" A#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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