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

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

[复制链接]
查看: 2091|回复: 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
. k: _+ T$ }- k* w$ G  B% Y2 H* k, }$ r- N; @5 [' R! O

1 L, ^: _8 F8 ^" K: S% V! j! `在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。# j% \; _, a: Y; J' H+ A( t

2 ]+ e4 [+ {/ `/ h# L8 R) \2 \  ~4 S函数GetTextMetrics声明如下:+ p( S" e$ s4 R2 s- U9 t
/ Y/ V" ]7 a, F; `. [& e# ^
#ifndef NOTEXTMETRIC
3 G0 D! |0 R2 t1 I
6 Y, r& h+ \" f, ?WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);$ L8 f) L. Z, r( ~( T0 @7 z4 \. M
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
2 D# j- h, S/ B# w#ifdef UNICODE$ n- ?6 P  V' f8 ~) H2 c. F
#define GetTextMetrics GetTextMetricsW( q" }6 @  X/ I: D
#else
- K  c! _* T, h4 `* e& l6 L( I9 C#define GetTextMetrics GetTextMetricsA
4 q6 n. \( |8 d! y3 S#endif // !UNICODE
) F3 M5 A* r3 N- b4 K* E1 q ( O  U, |/ j# K0 R- P
hdc是当前设备的句柄。
8 C+ d7 o2 _1 \* s8 n% Olptm是获取当前字体属性的保存结构。它的结构定义如下:- {9 p/ g8 c: C" n6 T
typedef struct tagTEXTMETRICW
4 I4 r) W$ [" D. w* [' R2 i7 m, p3 s    {9 w) N1 [$ n  e9 a6 K
    LONG tmHeight;8 z/ ^) f3 |6 X9 `3 f, K# d1 `
    LONG tmAscent;+ o& v& O/ V8 O( w
    LONG tmDescent;8 E# x( ^+ v( u$ _- i1 ~1 u
    LONG tmInternalLeading;
# q* v! P' w0 U# J) a& X7 n    LONG tmExternalLeading;
, _+ s3 b1 B1 |# L% i    LONG tmAveCharWidth;. d* E: P/ F# M% j" K
    LONG tmMaxCharWidth;
& L! D% G4 H9 A1 I: J2 a! p5 d    LONG tmWeight;6 C- s  F; N! U' Z9 J
    LONG tmOverhang;
  n8 x0 Q6 e' b& t, r7 I$ s    LONG tmDigitizedAspectX;( ^; @: h6 D* a! P
    LONG tmDigitizedAspectY;! ^: \; y6 O/ E8 A9 r" U
    WCHAR tmFirstChar;
/ l' ^+ m5 ]$ f" u: l    WCHAR tmLastChar;: u+ L7 _  T7 D
    WCHAR tmDefaultChar;
+ V' G' L0 g( W2 K    WCHAR tmBreakChar;4 n* ^, o8 r! @  ?3 q
    BYTE tmItalic;+ ?$ O1 z: l" P" q
    BYTE tmUnderlined;
; f9 R7 W, [  @# D/ c1 n    BYTE tmStruckOut;
0 [$ L4 ^0 z  w, e8 ?    BYTE tmPitchAndFamily;- O" V1 J1 M( M: s
    BYTE tmCharSet;
! k8 U9 x- V3 y5 a- ]% E    }     TEXTMETRICW;/ X- T! _0 R+ a$ V6 z
2 n/ @) ?. Q/ b2 p1 ?& e
调用这个函数的例子如下:' Q( F" l  ^% r, p( s1 j
#001 //; ~  f! A( Q& z4 d. k& ]) m
#002 //界面显示输出.: Q: j" Q& D! Q" w& k$ P0 H
#003 //  v) k7 {+ ]- |! d
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
% Q8 m* B7 ?' D9 U" O) E7 S#005 //5 _: a" s% Z4 {7 E
#006 void CCaiWinMsg::OnDraw(HDC hDC)
7 P+ Z- Y: J$ D' y6 O#007 {. ?9 _! g: D, `) ]& i
#008  //
) c3 V2 i# [6 K7 O% j4 y#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
0 z0 {. D3 B& L! b+ S+ D1 u#010  2 C7 N. I7 g6 `0 F1 a
#011  //设置输出字符串的颜色.& O9 G2 s5 |: {3 K  o3 H) [% \
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));* Z6 Y3 E/ ^( P  _' ^8 X
#013 ; b: |3 n7 l3 ]1 X6 Z- o2 B, l
#014  RECT rcText;   
( e5 @5 ?* Q; i$ L#015
& s2 l8 a) W0 k#016  //设置新字体.
: S$ H: _5 F, p) H2 z#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());. Z6 M& P8 h: I; v! b# q, ]5 m
#018
7 d# c5 r1 {% s7 @3 c' a1 u#019  //获取当前字体的高度.! K  W* u5 x% t7 C" B" c
#020  TEXTMETRIC tmFont;% q. v$ v4 u. f7 G) s. i
#021  if (GetTextMetrics(hDC,&tmFont)), k) w5 `* q* s8 S: u/ f) k
#022  {9 y: h1 B  F# W! U* G
#023         rcText.left = 10;+ L6 n# k& Y( X
#024         rcText.top = 40;6 U) `8 I- C/ h2 h7 J6 L' a0 U
#025         rcText.right = 300;
) z' }, K9 Y* B  _( @' w#026        rcText.bottom = rcText.top + tmFont.tmHeight;    5 D: X1 l/ ?' g7 z  a
#027  }, A/ _* Z( N# {' S, A$ P
#028  else
; ^+ ], a* X1 p" b" |#029  {
% w" X. _. b" O" O8 b8 B#030         rcText.left = 10;3 q: \( q* k- p% w
#031         rcText.top = 40;
$ Z( g6 Z& p1 o/ x#032         rcText.right = 300;! s) F9 C& i9 f; Z- U9 `
#033         rcText.bottom = 80;/ U9 m+ s1 D& L( h
#034  }; I' e1 V/ J) v# g( Z- ]
#035
: A0 Z6 R0 t% t" \' R#036  //创建黑色的画刷,
# R8 D0 r3 [- m! F' J#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
% U- v+ N& e0 v' H' b#038
( R+ ^; @3 [# }#039  //用黑色的画刷填充四边形的颜色.
! c+ B" {& d5 p. [( `. X. j% W#040  FillRect(hDC,&rcText,hbrush);
4 J( [9 X6 G4 h+ e0 B7 J9 l: z#041 4 X6 k! g1 G5 j0 ^: t% {& @+ l. x
#042  //删除画刷.- S+ b$ E9 d$ m. j3 h
#043  DeleteObject(hbrush);
2 B/ g) N/ M' r: ?0 J7 |0 R& E4 I5 x#044         , M' p" a5 L+ V" P# i- u& X: p; ~
#045  //设置透明背景( p! j  }& E- B7 `/ ]9 D: X
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);$ q3 Q) a/ k3 ]3 m
#047
+ ^7 K0 m$ n& e3 r: e' g. _#048  //显示字符串在四边形的中间位置.# F( Q: @' A; M3 k) Q* n- A
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
0 e4 w- ?: @. @9 l# p& v& c5 o. e#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);+ R) O+ |5 w5 O2 K
#051
$ K3 B+ G2 ~7 F/ t+ P#052  //恢复原来的字体.
$ A" z8 \: w4 Y4 g#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);/ l$ y$ l1 \9 U: a. Y
#054  DeleteObject(hFont);
. w$ d) y% ]( h& h7 K0 L# g#055 & V9 r/ d' [+ J5 F
#056  //恢复原来的模式.# Y2 ]1 O8 E5 l5 v2 z# C
#057  SetBkMode(hDC,nOldMode);
" s+ F  X1 O* \( g3 c' W8 Y, k#058 - Q7 Y7 W0 W3 I8 ]1 L
#059  //恢复原来的颜色.
7 r" P8 j' O. k#060  SetTextColor(hDC,crOld);
6 s6 y  E" ~" M& q3 {) a#061 }
6 ~% x( ]- B& S, P#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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