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

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

[复制链接]
查看: 2090|回复: 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/ i' l! y/ T) Y: d' ~
) d2 D, x) _8 S' t9 {
! q- z- Y9 m3 s" z. `, n
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
* u9 i! N3 D; s 5 Z! {# ]( S+ v  w8 I
函数GetTextMetrics声明如下:) e# X+ p( W: z3 Q" g  `

$ `8 B! [4 n0 w#ifndef NOTEXTMETRIC
5 U, _0 V' J/ `+ h/ Z1 H' Q+ N " i. z* a* C1 }* g2 ?! Y# E. X
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
/ N, s" Z  T( a2 o  x+ N+ AWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
) [2 K& T' L: t#ifdef UNICODE0 O+ I: H( f$ q; s
#define GetTextMetrics GetTextMetricsW# F- b7 p& v+ b( I) S
#else
7 K' A9 w/ L! }  J9 |4 H% O#define GetTextMetrics GetTextMetricsA
% `& ~3 P  K* w. Q8 r) p#endif // !UNICODE1 ~/ E0 u. s) M# `1 u4 x

3 d) f- v3 b3 l$ H) R& G# chdc是当前设备的句柄。
$ p; I5 w* ?  P* V+ nlptm是获取当前字体属性的保存结构。它的结构定义如下:# Z( s6 G- y8 f1 b
typedef struct tagTEXTMETRICW1 [) W& b+ |* D, }& Z$ g  T1 t
    {
' _3 y* U; O. Y  D4 H    LONG tmHeight;8 x) |7 t" K/ K8 b% u# {
    LONG tmAscent;
7 O( h0 O- h( N! r    LONG tmDescent;( e: N  I8 m2 ]5 _) D
    LONG tmInternalLeading;
" V5 o2 y0 T) f9 b. `- H    LONG tmExternalLeading;1 `6 L8 v& t1 f3 k4 D8 P
    LONG tmAveCharWidth;
$ u( ?; O# J0 @: `! Z8 g! w    LONG tmMaxCharWidth;: Q' p% r  C! r$ H& J: C# P
    LONG tmWeight;
# v" m4 `& Z; r    LONG tmOverhang;$ Y+ |1 N1 s" [5 P% }# }, J5 _
    LONG tmDigitizedAspectX;: B/ T" E' W0 R7 L
    LONG tmDigitizedAspectY;
0 ?' p5 Y+ o& t( r$ B9 A$ X3 P    WCHAR tmFirstChar;! T0 @# k) x* ^5 I8 n
    WCHAR tmLastChar;
1 v- z7 L. y/ m    WCHAR tmDefaultChar;
* A" m% \# m$ G- z: @' Q7 D  H    WCHAR tmBreakChar;! i+ Z/ S! e& Y$ x) A
    BYTE tmItalic;% u2 O( }) K4 ^; o' x3 C0 A5 X3 T
    BYTE tmUnderlined;: F! Q/ E$ ~: [& e' r$ q
    BYTE tmStruckOut;) M" o  _' P* n5 p; W3 v+ E% @
    BYTE tmPitchAndFamily;
+ i% X$ z( u+ A5 A    BYTE tmCharSet;
, [/ q. `. {+ n! V9 Q! H    }     TEXTMETRICW;
' Z5 ]/ }6 ?% l( |3 X* v
7 T$ {- j7 ~, }4 q" ?调用这个函数的例子如下:
) V- S! I) S3 J, ?#001 //* ~! [4 l2 v/ }" E! g
#002 //界面显示输出., Z: a8 ?3 z0 I) P. s0 g
#003 //. X7 z' M! Q  [6 B
#004 //蔡军生 2007/09/06 QQ:9073204 深圳. M6 A4 G: x) w! W8 [3 P2 a0 B) I
#005 //% Y3 ^$ E# k% t9 S# d' \& M1 L6 `
#006 void CCaiWinMsg::OnDraw(HDC hDC): G6 r5 j3 l: z/ [
#007 {: ^# }2 g- d4 o) J: W9 S
#008  //
, O% h/ o4 U# I; N9 b/ [! Z1 M: F#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));3 F/ |* w* Z+ R& n# k
#010  & z+ I9 B! E4 D4 C" t( f4 B6 }
#011  //设置输出字符串的颜色.
" Z5 G0 v  [0 u#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));$ _% @2 o: M, W  X
#013
. a. L! p/ S  y( [#014  RECT rcText;   
- S, _& x1 E/ E1 H+ s6 L0 a  f#015 & D7 t5 n: U( D; P6 Y# L
#016  //设置新字体.) w; D' w5 e6 j+ ^' @6 ?4 Q
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
- P- [; }' A! G4 ?#018 - f% J2 c- l& r$ S* U0 k4 B% j2 L
#019  //获取当前字体的高度.& x) K' `) @: I) @3 f
#020  TEXTMETRIC tmFont;) u$ y. \  ?" B  c. T3 Q1 o
#021  if (GetTextMetrics(hDC,&tmFont))6 g' A9 y. V; T/ L
#022  {3 V7 s6 |2 k( S' M
#023         rcText.left = 10;# S: Z3 I5 T3 N# S: F: r
#024         rcText.top = 40;+ }* r, a' _* ]* H* m9 }! s4 ]
#025         rcText.right = 300;
- }! V) C# S3 r# w% D) e: b* A4 ?#026        rcText.bottom = rcText.top + tmFont.tmHeight;    6 Y$ V  R7 C7 q
#027  }
" ^$ K  s( w- p5 s. U1 k: t#028  else' s9 I+ U$ O' `) @; z
#029  {( _2 D7 E- ~  R0 l7 Y; k
#030         rcText.left = 10;
: O$ }  e# y) X$ c% s* u/ B#031         rcText.top = 40;8 _! y! k; c3 ?1 J
#032         rcText.right = 300;
4 k  a9 f6 r# N/ @$ c  t, u#033         rcText.bottom = 80;/ t) ~8 O! z" z) j# z
#034  }9 B# y6 t9 t3 j/ b* e2 t+ @5 L
#035 ! x( a& z$ O/ S0 E7 M* v6 _2 b
#036  //创建黑色的画刷,
7 N* u2 T: K' V+ u#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));% ?' y! c7 F6 J: Q& X6 G1 Y
#038 / z5 T$ Z) D/ W9 F. l: |( I6 K
#039  //用黑色的画刷填充四边形的颜色.* [& q! {. B& @/ {# C
#040  FillRect(hDC,&rcText,hbrush);4 E: r! B$ l, f# `
#041 ( {% X! t6 M% a. {. n/ B
#042  //删除画刷.
( P, f8 I' N. w& |#043  DeleteObject(hbrush);
* K- v& J3 s1 m* C& y9 P1 f, y#044         & u3 m7 G! O% ~
#045  //设置透明背景& U% _. y7 |9 d" i7 `
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
( [. Z5 ^9 s6 k3 I5 `9 \#047
/ _; Y6 F0 F! k2 V& C#048  //显示字符串在四边形的中间位置.
: S) ^6 `9 \) X/ Z7 k8 z/ F#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
# q! E2 t4 F$ L! O1 x& Q' c* Z#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);6 @# a. S; t  c; j. N/ s
#051
5 h3 {1 g; U+ d' R#052  //恢复原来的字体.( G5 @9 f7 e% {  l
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
! l; I* @" x: p6 p& R7 [4 C#054  DeleteObject(hFont);9 {8 B2 x, Y" d% _6 U
#055 # `1 r. Q8 v2 G: z4 H4 n/ y
#056  //恢复原来的模式." H6 c' P$ q5 o- O' b4 b. c
#057  SetBkMode(hDC,nOldMode);& O8 k" [" p) T4 R' ?, o8 x' P
#058 ' F  j3 J7 [8 X( c. A" r
#059  //恢复原来的颜色.
3 j0 J% P  z6 c- @- y8 {. {#060  SetTextColor(hDC,crOld);
* v4 |8 ?- @3 j& |) l#061 }
) M# ~! z  S& [, m#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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