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

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

[复制链接]
查看: 2033|回复: 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
+ Z% b- E* F: b' T; O' t" t# \9 E
6 q: w" L& y% b3 P5 f# U2 _
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。3 n2 ~, \0 S" n- I& e$ ~3 H  e4 u. @

! e) |4 d) [6 @. W4 O. X; D函数GetTextMetrics声明如下:! `0 T5 q7 b6 j3 K" `4 K( D

) t6 k' u  E+ h#ifndef NOTEXTMETRIC: ]7 w/ s4 L! v8 x& e! S$ d& L* ]) d

  m) [! y. W) t6 ]WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
* E2 Z  l8 m. p4 UWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);( u& K7 U/ p; n6 M1 k
#ifdef UNICODE. ?3 J$ n1 v7 g  f
#define GetTextMetrics GetTextMetricsW* N" [9 ^* B% l+ ~  K3 l
#else. ~& T" h. v+ T( t9 }
#define GetTextMetrics GetTextMetricsA# `, Y8 s( K9 e6 p9 e
#endif // !UNICODE
# H( b8 W' o8 d) I: j7 [ & R" o/ N2 z) r
hdc是当前设备的句柄。! H7 L) Y: V# H9 J5 ^
lptm是获取当前字体属性的保存结构。它的结构定义如下:, V5 z) G- x+ r1 s5 i
typedef struct tagTEXTMETRICW
4 q5 {" E, z& m" o    {
( n" }) L6 b9 Z4 e2 x4 h! o$ t    LONG tmHeight;3 L! x% a. N4 N4 o$ @7 B' t
    LONG tmAscent;2 ?2 I* T% y) G8 T$ ]' A
    LONG tmDescent;
+ B  ~4 _* P, r/ X. i$ {    LONG tmInternalLeading;
, K. N/ m8 A: m8 ^0 b: ?+ _' k    LONG tmExternalLeading;: y- F! x- ^- t) l  A' d
    LONG tmAveCharWidth;6 K& C8 |5 {* Z! U9 Q
    LONG tmMaxCharWidth;+ X& I8 m0 S5 A& M5 c( o
    LONG tmWeight;' Y# l6 ]8 ~( g: D, [
    LONG tmOverhang;
$ P6 e( }( ?" A1 q    LONG tmDigitizedAspectX;$ `  u% y% g  k
    LONG tmDigitizedAspectY;
& _5 @# H( Y, A  M. n4 J; w    WCHAR tmFirstChar;% g* d6 b  a7 e8 L! R2 g
    WCHAR tmLastChar;
3 I, _0 c+ Z* N% g    WCHAR tmDefaultChar;
6 [4 |; d+ o7 ?. [; w# P    WCHAR tmBreakChar;0 U  \: C: N! n% ?; B* d: E" E
    BYTE tmItalic;$ m5 c, x0 e9 \$ d2 z
    BYTE tmUnderlined;
0 n) U: Y. b) o    BYTE tmStruckOut;" i8 s5 X0 W2 k% k0 u
    BYTE tmPitchAndFamily;
+ u8 @" S/ T" S6 i, j    BYTE tmCharSet;9 F) O3 M- {) D9 e4 p  g
    }     TEXTMETRICW;
3 W, {: e+ M, \  O* h
( l9 B  i; N$ ~# _: a/ r/ X调用这个函数的例子如下:; l2 o( ]3 e8 i6 y; G6 `
#001 //- D6 @  W( A4 ~# }! R. q
#002 //界面显示输出.  W6 m8 F* X. n7 l1 a
#003 //; z$ `. P# W9 N3 K' u( V
#004 //蔡军生 2007/09/06 QQ:9073204 深圳2 m4 d2 X+ y  X
#005 //
1 l* U, W/ L* q5 D  y& `* Q+ Q#006 void CCaiWinMsg::OnDraw(HDC hDC)
1 j* `* k9 o2 n. i& P#007 {
( e7 R4 D6 N' k; S. r#008  //
& x0 P% i. ]- _6 Q#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
4 y# b: U$ v3 ?' m4 U7 r#010  ( c1 |% j2 x) `0 D, B& T- H) I
#011  //设置输出字符串的颜色.
2 c1 l+ D# ]) t) g6 U% g' Q2 `#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
9 D! R+ ]2 N+ N#013
  ^# Z" E6 s2 Q& l9 W6 @#014  RECT rcText;    6 \  g; i. J% X: H( l
#015
; g. l* D1 X7 ~#016  //设置新字体.9 H1 [# N! Z9 v$ _
#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
- W. W4 `! y: A) Q2 n2 d; k7 S: z. M#018 1 o$ |% `! S! k* v
#019  //获取当前字体的高度.
+ D* L  |" V3 S& A% ^  a7 o, T- {#020  TEXTMETRIC tmFont;1 m( u; D) S6 L; x/ A
#021  if (GetTextMetrics(hDC,&tmFont))  H- G. {! Y" `
#022  {
  W: e" n8 h5 x6 [- W$ W#023         rcText.left = 10;' R3 F( d8 h0 v5 c8 Y
#024         rcText.top = 40;" W# a7 _8 c2 K3 X2 \0 W' M
#025         rcText.right = 300;
& z/ P% `! L" B# g#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
1 h! C0 W! W  R  M/ F: N4 j4 D#027  }( i+ F5 G; [& N7 t' J
#028  else
; d# v: a/ ^, E3 M. r9 \: o' A#029  {5 i+ V5 ]" c5 |/ ^
#030         rcText.left = 10;
/ g' C, X5 a: l$ f; w$ A#031         rcText.top = 40;
. B  C/ P9 G, _2 F& Q#032         rcText.right = 300;0 C# R1 i6 f* D) \9 K! O8 N% L
#033         rcText.bottom = 80;% d) K6 m( N' \  l9 Q+ m. x" o
#034  }2 }" _' w+ I6 K
#035
$ w. N( w6 M; b3 I' i#036  //创建黑色的画刷,0 O* @2 m  O2 t( v) P
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));: M& x; Z3 s% p5 C
#038 * I& o$ }! U" u) }  s( C. ~
#039  //用黑色的画刷填充四边形的颜色.% C6 p# d3 [1 d( q7 J) {; i
#040  FillRect(hDC,&rcText,hbrush);
+ {: C/ m! Y9 P$ d2 P- l#041
: o( U5 g. C) a/ Q0 S3 ^#042  //删除画刷.
  d/ n7 j4 q( h7 Z8 b8 H$ D! k+ J#043  DeleteObject(hbrush);6 e8 I) _$ |" \- }1 E
#044         2 L* H7 J& i* t0 U8 C' c/ o5 N" S
#045  //设置透明背景
8 w! Q8 Z% z1 }6 G2 i#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
' U4 u  O1 g9 Z' l5 j& l) w4 q#047
2 s/ T, B0 u. G% P. O4 t! V+ Q* j#048  //显示字符串在四边形的中间位置.6 }' J- |. x. D  ?; ?9 u
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,% S, p8 l( E( d- q, r) l) L
#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
$ U4 P: A" c; G2 W. S6 Y2 q1 Z#051
# A- y& [% p6 c2 e#052  //恢复原来的字体.7 a9 z& y0 U/ r7 h0 H, U
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);6 N( m9 g' x. |/ ^9 r' d$ F; v
#054  DeleteObject(hFont);* V. o; j5 {$ g% U/ T6 d- p
#055
2 T8 T7 J. q) G7 }/ F#056  //恢复原来的模式.
) e) k& U7 \" a" x* U% M& C#057  SetBkMode(hDC,nOldMode);
* B8 H, L( i9 s2 r( O#058 " X  a, c; ?3 G3 `8 ]
#059  //恢复原来的颜色.
/ S6 c8 T, d4 L#060  SetTextColor(hDC,crOld);
  {" ~. G( ?3 ^; |6 e1 s6 x#061 }' K8 @+ u0 T6 z3 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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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