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

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

[复制链接]
查看: 2052|回复: 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
0 @4 e" t0 G3 g/ k7 _" n
6 G9 g, @1 ]+ P
) H4 Z0 V0 y5 V% l- W在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
; G! r) J) _2 R4 F
8 w+ d% ^* w, _9 U% F函数GetTextMetrics声明如下:2 ~3 W- D0 s+ o! k* u9 Q

/ l2 r, P" U# P) V( f9 b/ t#ifndef NOTEXTMETRIC: ?; x0 y5 \' S: R) W7 ]! o
% g4 k! W% i% N* J8 V! o5 l
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
  e0 q2 I; g0 DWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);9 {: Q: b$ L) B2 q5 G/ ?  C
#ifdef UNICODE2 O* \  A. t$ P0 U$ w9 x2 S
#define GetTextMetrics GetTextMetricsW
9 ]8 C/ M7 w) N) o#else
8 r/ X: r- Y: x& u) ]# z#define GetTextMetrics GetTextMetricsA
" v/ J& _6 _( j+ V#endif // !UNICODE
( c( t: B+ c9 L7 [
. \5 Z0 @3 \! C( x6 \hdc是当前设备的句柄。- X: s4 i! H  [
lptm是获取当前字体属性的保存结构。它的结构定义如下:
5 B8 p# z; x5 ]- Rtypedef struct tagTEXTMETRICW
" A: T" S1 k% D2 [* u- U1 N    {
. t+ B* P# M! Q" G    LONG tmHeight;) v( J0 ~$ m. z2 k
    LONG tmAscent;
; o4 }! G$ `2 p) Q    LONG tmDescent;$ e& Z5 x9 w1 `% G$ O, \. U
    LONG tmInternalLeading;
4 ]9 N( m; m5 q$ B5 g' F, e    LONG tmExternalLeading;* j$ |8 e5 T; z8 N% M. V8 L! S9 o
    LONG tmAveCharWidth;
7 O" T. l8 N4 g$ ?4 W. v    LONG tmMaxCharWidth;; L2 n( d3 }+ P5 D$ ?' f: s( X8 W' N8 d
    LONG tmWeight;
' s$ p0 o: A( e* k+ V% D    LONG tmOverhang;% R& P7 Z: [$ H6 C* o8 g) b, u
    LONG tmDigitizedAspectX;1 U9 T6 Y& s9 j4 ~3 f# h/ P
    LONG tmDigitizedAspectY;
) i  B- ~) N2 Y+ s' P* e  E$ v8 y    WCHAR tmFirstChar;" x  O9 \/ r( L+ d/ y
    WCHAR tmLastChar;
5 H" s- N' j9 \# l3 [    WCHAR tmDefaultChar;
4 G" X% c5 H5 i6 Z! f, L, z    WCHAR tmBreakChar;$ J7 s) c' `8 R7 j
    BYTE tmItalic;. D* g4 ~& |/ `; i; g. C/ `
    BYTE tmUnderlined;
: o/ }) J0 U, u, B8 l    BYTE tmStruckOut;: e  J) T& o+ E: d' P
    BYTE tmPitchAndFamily;
9 Z5 h% H+ T! f0 Y5 a    BYTE tmCharSet;
. [* h& \3 n) g1 e    }     TEXTMETRICW;
7 z" P, T+ }7 [4 M8 B$ V
# I5 ~) O0 q" T) r调用这个函数的例子如下:- V  U- J5 |! [7 V- ]9 }8 R
#001 //$ v9 G- p6 o1 p# K9 n3 i- G
#002 //界面显示输出.
# O8 [- D. W9 M- Y( I. ]( ~+ P3 z#003 //
/ K8 C  [  a% G8 |  I#004 //蔡军生 2007/09/06 QQ:9073204 深圳3 E( J5 O6 }% i
#005 //& z$ B# q2 P2 \& {+ @" U6 l
#006 void CCaiWinMsg::OnDraw(HDC hDC)
6 y0 ?. y$ b# m, j#007 {3 ?' e! s, v. ^8 u
#008  //
+ p4 p; ]4 j+ o8 k#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
+ R& o- A' ?; X/ R. E# S' g& u#010  
( n/ u% {; g- {% Q#011  //设置输出字符串的颜色.3 y! j4 y0 h3 [2 k  y
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));5 b- ]1 b" g  D- }
#013
3 {6 [8 S' @0 B! H& w# p#014  RECT rcText;    / ]8 G3 a1 t/ m$ U: p, e
#015 : C* P3 T5 n1 Z: q/ x9 H) R
#016  //设置新字体.* m7 b1 y* h3 g$ m& \5 C( x" e
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());; @# Q. J. @4 W# s6 D. h
#018
1 V" ]' ~( \& [' ~#019  //获取当前字体的高度.
3 y' u3 Q9 L- Z# C9 ]0 I9 T#020  TEXTMETRIC tmFont;4 l  q$ O- R! L. u$ ], O
#021  if (GetTextMetrics(hDC,&tmFont))
4 [9 N. h1 J1 U! S2 ~( z, j. U9 n* ^#022  {
8 x. ?6 P# b* z: b( {  @! n$ U$ ]  u#023         rcText.left = 10;7 c3 N% A# [" |5 j; Y4 ?. D; ^$ B
#024         rcText.top = 40;% |4 p% d6 }1 o, H6 g
#025         rcText.right = 300;
7 q' A8 I- h' g0 P; O#026        rcText.bottom = rcText.top + tmFont.tmHeight;    % E, X7 d& W6 m9 _( n4 a
#027  }
1 Z9 ?& f0 V1 l#028  else  Q+ X& H+ I: }& N$ ~
#029  {
4 ?" F+ u0 R4 c1 V* r( O#030         rcText.left = 10;" y, T0 \. D4 f# g* T
#031         rcText.top = 40;
2 U; A) \9 T8 K5 c, T% O( k$ b#032         rcText.right = 300;
7 W, N# J! I. m) q#033         rcText.bottom = 80;
6 X5 \5 w0 q& @# ?3 J#034  }
! e! j0 s/ f$ u, B- `9 i1 W#035
) z) ^8 I( u2 b, L5 S6 Q: Z# b#036  //创建黑色的画刷,$ [+ d2 W3 P5 V9 i1 d
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
8 z4 C6 I0 t" H7 K1 f#038
& s$ s, U' ?6 r7 @#039  //用黑色的画刷填充四边形的颜色.2 i: E6 A1 B# \+ r
#040  FillRect(hDC,&rcText,hbrush);; e  n2 x9 g8 O; w/ y/ R: J
#041 2 t( H- B3 J0 D! l7 r8 G
#042  //删除画刷., ~! k( W' W, I# K, r
#043  DeleteObject(hbrush);
6 L" \) t3 d6 N3 h#044         
& w! q9 Q" s1 Y5 e! i#045  //设置透明背景9 O( E- \8 O6 [4 p; k0 n; w5 x
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);) d9 e( Y/ Y/ ?& g& O3 X
#047
1 r) D8 ]. [( U3 J#048  //显示字符串在四边形的中间位置.
% w. p; J% J6 n#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,8 C4 r8 {# u8 g8 z
#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
( U4 f1 y3 {% p+ _0 D! C#051 ' M; K: s/ u! r
#052  //恢复原来的字体.8 I* o8 B5 \3 ]9 F
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);" D8 v# ~* x& P/ x; a$ i
#054  DeleteObject(hFont);
4 r; D5 V% t9 h0 u& K9 _#055
6 D$ f& R; v5 v- z) i) G, ~#056  //恢复原来的模式.0 y& r  k+ B; u! L' t$ P
#057  SetBkMode(hDC,nOldMode);1 H) L1 B% y- Y% B. v" B
#058 $ I! K' z1 V# {! d. l6 i" A) X4 `
#059  //恢复原来的颜色.% Z. m( D2 K" ?% `, q
#060  SetTextColor(hDC,crOld);4 X8 z  h, s1 U* g2 v) k0 h
#061 }
. z' D5 {0 B! 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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