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

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

[复制链接]
查看: 2032|回复: 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
  l( `3 f) |! |& N& P6 {( R# K6 Q6 q' e( \, x7 `
0 ^* w5 |2 l- ?6 G$ Q* k6 ~" Y
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
+ X4 k6 m% A) u( z" d
/ ]5 i8 f; U* h) j: D6 c: m- F, H函数GetTextMetrics声明如下:8 Y7 Y! s0 k5 c, c) d8 i& b5 V% l
: r5 g: A" H6 g, I& \. j2 \/ V0 t
#ifndef NOTEXTMETRIC
- M& i7 m+ W2 Q$ X+ ]7 a+ u ( q) _$ m- A. y! j; [' p3 X
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
1 S; o4 \7 Y  @6 k; r9 q) \, e& GWINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);! a8 z6 j% N' \' }
#ifdef UNICODE, V* I- [- G' z( I/ @4 K
#define GetTextMetrics GetTextMetricsW! }$ T; j& g$ E  j5 ]6 I; J
#else
! ^1 R2 B7 _# z#define GetTextMetrics GetTextMetricsA8 l/ f8 ^/ b* ^$ E2 _; N
#endif // !UNICODE
: c  c0 ~1 p' a  k- [. G9 M
: j' u" g' V: A! b1 e6 S9 ihdc是当前设备的句柄。- I2 @: i1 F: l' ~) L# b% z9 b
lptm是获取当前字体属性的保存结构。它的结构定义如下:) j" T4 d9 h+ Z1 p: k+ E
typedef struct tagTEXTMETRICW2 c4 A) }4 ~) t
    {
/ U9 ^# M/ P7 k3 @6 O7 N    LONG tmHeight;, \# ~: \( b( T+ r4 M
    LONG tmAscent;
4 I$ m( t8 Z# ?8 m# J0 w2 ?    LONG tmDescent;" Z' [: M/ Y) Z9 B, ?
    LONG tmInternalLeading;
, r' M3 }, t+ @' R7 U* ~    LONG tmExternalLeading;" h5 B0 B+ v/ N8 T
    LONG tmAveCharWidth;0 ?6 l) i0 M. C: P; F; N
    LONG tmMaxCharWidth;
- ~& x. U2 j8 ~: i3 |& ?    LONG tmWeight;0 s* W4 ^6 u* @" z  m. q! m* N" G
    LONG tmOverhang;
( I8 J0 s9 M9 x9 G) h+ S: J; \    LONG tmDigitizedAspectX;4 R! e3 h5 @4 _: d3 y' ]8 [
    LONG tmDigitizedAspectY;0 O$ _  c8 m& d1 L. W4 l
    WCHAR tmFirstChar;
$ U7 x. T3 e' o7 W: ~    WCHAR tmLastChar;- u$ G. F, y4 i; R& b
    WCHAR tmDefaultChar;+ Z( A4 o- G2 E6 s# B: y* Q. f
    WCHAR tmBreakChar;
% q0 D3 D( T; Q! e) K3 ^    BYTE tmItalic;
0 E0 D0 a+ q. C  V    BYTE tmUnderlined;
: w2 J5 u& L% i    BYTE tmStruckOut;
, O! u" d0 I8 D0 B6 q    BYTE tmPitchAndFamily;6 @7 |1 r  J+ @5 ^2 [4 f0 G
    BYTE tmCharSet;
% p* Y4 A% I8 w! y" ]    }     TEXTMETRICW;
+ s2 h0 \5 ]$ ^! O/ Z
+ A$ s2 t* C: s0 G; j调用这个函数的例子如下:
$ r2 ~7 u! |6 }#001 //* z& h/ Q- ^, H) J8 n
#002 //界面显示输出.1 X# p0 H! I9 K2 @5 S7 w
#003 //& ]+ d. h; W$ x$ n
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
+ O6 a) M: u& s1 U#005 //4 R7 X8 w  H5 m0 Q# T
#006 void CCaiWinMsg::OnDraw(HDC hDC)
( Z0 b' C2 X7 C( H% }$ S#007 {
( W5 j5 m" M$ h6 ?7 p' W#008  //
4 N( r6 B& p1 F#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));. T  j/ m- J: d; f' b
#010  3 g2 l3 r; A# X+ w
#011  //设置输出字符串的颜色.
+ V$ T: [4 l  X8 X: G* h#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));% o, L: b* \3 J4 r
#013 " D5 E4 s7 Z9 ^7 F! ?
#014  RECT rcText;   
# M5 c2 p7 J' Q* @4 J#015
0 O8 C2 m. B7 u9 Q#016  //设置新字体.
2 T' N: l3 B' e- \#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());, O" D* g9 J) ]7 j( a# Q
#018 # B# a" A* N7 r  R2 u, {: J
#019  //获取当前字体的高度.
1 ?* B2 R) l- i& @* U#020  TEXTMETRIC tmFont;8 E) X* F7 H5 @& q
#021  if (GetTextMetrics(hDC,&tmFont))
4 i$ F" E  p" k/ o; a#022  {
( y/ ^& Q4 y. E#023         rcText.left = 10;
# m$ m) w- p! o) M0 D4 ]#024         rcText.top = 40;
" R8 q( p# ~/ V/ b. P#025         rcText.right = 300;
: B+ r+ w0 D9 x4 {7 Q2 q& J+ M#026        rcText.bottom = rcText.top + tmFont.tmHeight;    5 t! j( w/ ^) R7 M+ \( a
#027  }
) u! Z1 [7 O, `& L/ k5 Q7 p#028  else# K2 D5 U0 r- I% [. w
#029  {
! V8 ]5 G% n) u" _! v3 p% n0 Y0 p+ O- j#030         rcText.left = 10;
: [% ]6 `3 Y% t& L. ]#031         rcText.top = 40;" I. k2 ]. N! ~( P" S& n
#032         rcText.right = 300;
2 M! y! V# n* u" M$ |* z$ }#033         rcText.bottom = 80;5 b1 }" ^9 ^9 S
#034  }8 V6 \, r' P. n3 n1 s5 U
#035
" {( e- y8 A9 t9 b#036  //创建黑色的画刷,& ^- T, E4 W; F# c$ Y
#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
/ ^) H8 r- M) X9 h1 e1 \#038
9 v5 ]+ @% ^1 i7 ^' w#039  //用黑色的画刷填充四边形的颜色.
3 u4 M, d3 P+ B9 x1 v1 ]* |#040  FillRect(hDC,&rcText,hbrush);
, S; p0 D. l/ y1 U3 f' e#041 # y- w7 K3 {; l( X
#042  //删除画刷.
$ d7 [  D8 Y& X6 O* W/ y$ ^+ ^#043  DeleteObject(hbrush);
* B( a) Z6 s! l* ~#044         
7 S5 {; S- U* V0 d( B' M* {#045  //设置透明背景
2 u; x0 W+ F: t1 X( |( I#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);) W( E8 I! j5 i& U% o
#047
5 ^7 _' M% l5 j9 P#048  //显示字符串在四边形的中间位置.
  f/ O: g$ |* @5 m1 j5 N#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
, M# a! }: T9 Y5 f% ]0 h4 |# @#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);& {6 i# \* E' d& ?0 e5 n5 Q
#051 . p2 S' O5 S5 K
#052  //恢复原来的字体.' H0 d9 v$ ?, ]
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
3 S, e8 C0 R" U#054  DeleteObject(hFont);+ \2 O0 t0 N% B. R# }
#055
0 U2 Q/ V* H3 r7 e1 e#056  //恢复原来的模式.
- S0 c/ a# L) C% B- t  O. @#057  SetBkMode(hDC,nOldMode);
2 R) e/ w! [7 S# p#058
9 F# ^$ T3 ^) i( F#059  //恢复原来的颜色.
4 ?$ o  p, F* |# a#060  SetTextColor(hDC,crOld);
2 ^2 S' V$ K  |5 Z#061 }
; v, g: m: U0 }  U#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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