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

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

[复制链接]
查看: 2061|回复: 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! V$ n/ h* g" ]
# H9 @* a  o( O" ^  H) ~8 V/ a  M; J+ U; d1 t/ A! ~
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
0 U% C  t" J. A* b8 ?
1 G; Q2 l: b3 H: }# s9 ?) _函数GetTextMetrics声明如下:
3 i5 n! s( W- u; z4 `   _2 f0 T; {: w  d  `
#ifndef NOTEXTMETRIC
/ ]1 e( ?  J/ q9 G 7 W! A& Z5 @- Y& \) B4 ?
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
+ x7 S- o) E' Q' m+ O9 O+ ^WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);8 a+ p5 H/ ]# L: v
#ifdef UNICODE
+ M5 b1 l( r! U% F4 g& O3 t( J3 B#define GetTextMetrics GetTextMetricsW7 F5 k& V0 ~/ u5 Z) [5 a6 A( A
#else$ A( q  x2 q' x4 T, ?6 _" _  W
#define GetTextMetrics GetTextMetricsA# O% A( Z+ |. ?; s+ J9 [' E! ?6 f
#endif // !UNICODE; g) }/ }, |6 b$ X: x
; O; [# ^+ i' ~2 @3 s+ `6 h
hdc是当前设备的句柄。  q3 n9 D. |6 ]0 J) y% B+ n
lptm是获取当前字体属性的保存结构。它的结构定义如下:7 t1 |. l4 \3 T
typedef struct tagTEXTMETRICW
8 D& c0 L6 }6 {, C% z. |    {
9 h% G3 Q+ _+ j6 }$ ^# `8 E1 ]; L/ o    LONG tmHeight;
0 M. m" K3 Z7 J7 C5 q: j    LONG tmAscent;
/ {2 H# p( I5 k; Z- M9 R/ C8 o# I2 \3 V' \    LONG tmDescent;
' r  K7 C) B% v& D2 f    LONG tmInternalLeading;
7 L' i* R# k" U' Y, W/ B    LONG tmExternalLeading;
2 o( |* h3 q+ e) N& \    LONG tmAveCharWidth;7 L) B5 ^# D7 f' D  V% y* O' v  Q
    LONG tmMaxCharWidth;6 V- {5 R2 z' t
    LONG tmWeight;
* O2 W* a: U6 S4 ]( b    LONG tmOverhang;
" M2 D2 R! x6 O6 n8 g- \    LONG tmDigitizedAspectX;- V4 ~/ b" {2 G( d8 F0 L- Y) E
    LONG tmDigitizedAspectY;4 I1 y! A! U& E3 n& F/ F, a
    WCHAR tmFirstChar;7 P, S$ U; ]+ P- ^' O5 ^; t0 ]
    WCHAR tmLastChar;
9 h# n( J# j' `    WCHAR tmDefaultChar;8 ~3 x# D( t& b1 u6 e
    WCHAR tmBreakChar;
* j' d. V$ U, H$ r3 C    BYTE tmItalic;
7 X; t( R3 U/ x  _% Y4 A    BYTE tmUnderlined;4 w0 K' ]/ r/ I' A( v
    BYTE tmStruckOut;
$ Q/ l4 M2 p4 C2 u1 B    BYTE tmPitchAndFamily;
- @0 j$ I. ~4 j9 u  p4 }% j' P    BYTE tmCharSet;
2 n4 r' W$ t, {1 Q0 [    }     TEXTMETRICW;) n8 G# p4 W+ f3 A2 ?

: b; N4 q/ l; t5 R# @" m调用这个函数的例子如下:
: Q/ o% \; y# ~7 e& C- V0 g. ~#001 //- k; G. P' A- r3 w* R
#002 //界面显示输出.1 e% d( e; ~% U0 _$ L4 [
#003 //
( x9 E) Q7 G+ j  @8 X" w7 j#004 //蔡军生 2007/09/06 QQ:9073204 深圳- ~  Q% O  n+ U
#005 //2 f( `. U* K: L1 h1 G+ D! V8 W7 t
#006 void CCaiWinMsg::OnDraw(HDC hDC)
: C: o9 K; @9 D' \#007 {
& e! s6 ?( c2 A" \3 R+ R  @#008  //# ]( T' p/ o3 m* T! X& Y
#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));9 V8 W3 V& T6 I' R, q" k
#010  
: J* v5 b% I) e' k#011  //设置输出字符串的颜色.
3 J. l! s1 N& C+ P0 [' I, x: D#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
9 q) u& x$ j* j  b" T, v#013 ; ~( U9 V) ^8 M8 x- O- \. X8 j
#014  RECT rcText;   
; `4 ]3 x+ k% h. S$ a- B#015 " K# X$ `/ d- n  P
#016  //设置新字体.
5 w) F9 z+ Y( r) y  u9 g- X#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());5 V$ z2 T9 G' ~7 {
#018
$ ?0 k" M3 ^( [#019  //获取当前字体的高度.
' j, _* L4 u# J9 l7 K#020  TEXTMETRIC tmFont;
6 ?! T! _+ _1 b  g#021  if (GetTextMetrics(hDC,&tmFont))
1 f7 z1 Z5 o" r% j+ W5 V. q#022  {
; a. s* V/ S- U#023         rcText.left = 10;+ q% g' q. o4 U
#024         rcText.top = 40;$ B6 s; q8 K. U) @; E2 F1 S
#025         rcText.right = 300;
; O, s# {5 d4 V, h9 n" f3 x' X: \#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
/ {9 k0 R6 c; \1 v- k0 ]#027  }
& H% @- K/ ?$ {' L9 l# u#028  else$ v" r# K1 D+ C, r
#029  {
# i% Z' f: i+ v: i) k8 y. u#030         rcText.left = 10;
6 Z0 F* j% h) h- H1 f9 S# M#031         rcText.top = 40;5 B: q8 K9 q) U
#032         rcText.right = 300;
5 h, d; u/ [4 ~# w4 [8 R* s#033         rcText.bottom = 80;& J2 i$ q' }( a1 s
#034  }
% B1 x' U, C% |* M( y#035
8 r6 `6 ^' M/ J' q2 U; K8 Q- J, t#036  //创建黑色的画刷,
* Y( z  p8 M. a#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
( n8 p2 p% F" A4 w#038 3 D* I: s" }, k3 A* }: k. e% Y
#039  //用黑色的画刷填充四边形的颜色." ]6 D  \5 A0 Z4 j- O$ Q
#040  FillRect(hDC,&rcText,hbrush);
8 j3 {, B9 T3 G#041
/ q( h- \, S. O3 Y" O; ?#042  //删除画刷.9 R( C1 I5 P' X) G
#043  DeleteObject(hbrush);
* s+ {& K# `( D( K; x- c! r: H#044         
( @3 y. E1 x9 F9 @; U  O2 h#045  //设置透明背景8 @. |3 r1 G! U! n8 d' {% E
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
0 X. z  p) ^' u& J9 T2 Y#047
) I% h2 K$ t9 n. d* a#048  //显示字符串在四边形的中间位置.
8 v# T% v) [/ |% P) o. \% D! I#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
: G0 d8 r2 `+ Y8 U& E  t; X! @#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);4 ^" w9 X% ^, Q7 n
#051
" F! c4 ~( Z0 l- P#052  //恢复原来的字体.
- z; T) E5 }9 l7 y6 p* f( g1 X#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
* @, J5 J8 }* B3 X#054  DeleteObject(hFont);
) k; P1 F, ~7 [7 z) z/ a#055
+ H* [. U( o1 m% f#056  //恢复原来的模式.4 W% L4 d! U& H) s
#057  SetBkMode(hDC,nOldMode);6 v! s- O( Z! f. p; Q. T; a, `
#058 + J+ C9 J- X/ |  d8 j
#059  //恢复原来的颜色.
- W2 W1 h0 l7 Q3 o4 ]1 ^3 O#060  SetTextColor(hDC,crOld);
! b! p8 e% y) @% b( Q#061 }- v6 G" ^" i- _* `( P- W
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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