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

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

[复制链接]
查看: 2120|回复: 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" A6 Q0 @: j9 d
  @# P# }  F5 u) Q/ H6 ~9 _5 u

4 o9 v# Q# \/ I3 }0 G. X在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
4 W. B6 }. D" q. W6 Q( G: S: Y3 a; K 8 d; V* n: f. W  b) s" o0 V
函数GetTextMetrics声明如下:8 a: e/ o5 n1 Y5 p& Q: F

, N; o5 @- {. L& \  _& ^#ifndef NOTEXTMETRIC; _! t$ h  Z/ A* y! D; R$ j
. B/ o6 J% A& j5 {7 [' b! s
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);5 P; h: c0 D) h6 l5 P9 ~* u! W
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);' j* |+ o/ D2 @8 F$ j" A% u
#ifdef UNICODE
% R1 M. M% T; B6 x" S/ Y* T- Z7 J#define GetTextMetrics GetTextMetricsW; T' c! d" \, m* b9 g
#else
. d1 K: l6 z0 }/ q! _( j% ^" H7 Q- v0 q#define GetTextMetrics GetTextMetricsA& z9 h/ R; p8 e+ R, z: Q% n
#endif // !UNICODE! Y9 ~' D5 {1 ^0 p% S  p: |4 y
  |4 O  I  l1 ]/ M2 V
hdc是当前设备的句柄。
: y( ^0 ?; I5 b. c, T+ l6 |& r: Elptm是获取当前字体属性的保存结构。它的结构定义如下:; g6 o4 k7 O( Y, B6 f. c# R
typedef struct tagTEXTMETRICW
: }/ f6 e, N9 \* c1 x: [    {
" c& W1 q% `( \0 E8 O1 o    LONG tmHeight;4 s9 O7 [. e% q0 e3 D2 ^
    LONG tmAscent;3 F$ ~# U! f& i0 j, F7 Y
    LONG tmDescent;- J# K1 |) P: H  K! U
    LONG tmInternalLeading;! E2 z8 d8 o( ^# h
    LONG tmExternalLeading;
' b8 n% x( j0 o    LONG tmAveCharWidth;
1 ^9 o* {0 g+ P1 }    LONG tmMaxCharWidth;
5 n9 _% d; @  [* G8 ]  O    LONG tmWeight;/ O# T5 M- l. \9 F1 d2 F9 P" E
    LONG tmOverhang;) |! z) N0 C! h4 S
    LONG tmDigitizedAspectX;
( F4 o4 Q" r- |% G" B, {    LONG tmDigitizedAspectY;
! \: y4 T6 B% \6 N% F6 J* E5 `    WCHAR tmFirstChar;
" K9 p6 k- u, C+ T! d9 u( C; e    WCHAR tmLastChar;) o3 Z0 ?: W; a$ y7 n
    WCHAR tmDefaultChar;
9 n7 z0 v0 Q& {* }( I    WCHAR tmBreakChar;$ f! n* z; {& \. H4 N% b7 Y
    BYTE tmItalic;! R+ z" i" O, R( m/ R( W
    BYTE tmUnderlined;
% U3 v2 D3 x) K% ^1 e9 m- |6 q    BYTE tmStruckOut;
! I8 n) O" @4 d7 O9 S% I0 y    BYTE tmPitchAndFamily;
3 z& r* b% W" {5 ?' I; Y    BYTE tmCharSet;2 D" \5 P" h4 d# k6 Y* k% ?0 E
    }     TEXTMETRICW;) z. X# G* [; |4 ^% G  B3 M

( h, j; Y) R* a& T  f( u! x+ |; K调用这个函数的例子如下:; I+ D' E1 g( P3 `" T) k, D
#001 //& o" ~& _. ^. V4 y4 s0 [, |$ m
#002 //界面显示输出.% A' t% g" r4 ]0 S; C1 y
#003 //
; R8 |6 ]( q- i' I* g7 i#004 //蔡军生 2007/09/06 QQ:9073204 深圳4 _& V% k7 R: @3 @% V
#005 //! n" M0 d0 {+ h* L, H& Q+ U
#006 void CCaiWinMsg::OnDraw(HDC hDC), Z% ?, l) t( O0 Y* X
#007 {
5 D% k. C$ c& g1 f/ k) E  C3 v#008  //
' V& t# h2 t  V7 v# z#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
; b- N% f" n' b3 B) T#010  . Z' f: x) o( o" z9 }' [
#011  //设置输出字符串的颜色., {+ i* d2 u; @5 W# a. w/ @
#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));) A; ~; g- B% o- O: R
#013
4 q5 r- {' Z+ \- C' i. z) W#014  RECT rcText;    ; }& ]9 K' y( K. D3 a9 [& t5 H
#015 # i' C- t' ?5 ]% m  Z) ~' d
#016  //设置新字体.
* ]# b  M1 l& H: L0 v) Q; u#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());- A2 l3 z/ r* r4 o
#018 2 n( w0 x0 s9 L/ k) G1 m) a! w
#019  //获取当前字体的高度.: {9 {& V0 ]6 L- G
#020  TEXTMETRIC tmFont;
5 T/ _$ ^' u% `  U#021  if (GetTextMetrics(hDC,&tmFont))$ @. y5 l3 @" W4 g) v- h
#022  {
; O4 ^, `( D9 a9 o* G( x; W#023         rcText.left = 10;
* |5 _* x1 ?+ `5 n& S#024         rcText.top = 40;4 d" u* v6 ~! z+ r: }4 o4 F( W
#025         rcText.right = 300;
# b6 B6 U5 }+ ^( K5 ^* {, G#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
7 K. @" y) W" O7 {0 O% k8 z6 v#027  }. W5 @# I! V: Y6 l& I
#028  else
- m; B- [' p, L( P# m#029  {
/ ^! F  V) k  E#030         rcText.left = 10;  ]2 n+ C5 r0 H
#031         rcText.top = 40;6 [2 A, I0 F' e
#032         rcText.right = 300;
* g" {* ]+ X9 c$ W8 \3 p. |#033         rcText.bottom = 80;4 d( i- h2 h' I. H& p* V
#034  }7 @* ~% ~. J0 L0 r+ d7 E
#035 * K* ?2 B- C9 F! F2 s
#036  //创建黑色的画刷,
7 S# C' P4 W! C" }#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
# k/ ~3 G- ?1 T#038   B9 _0 S% ]7 J) m  {) `* M  Y8 E
#039  //用黑色的画刷填充四边形的颜色.$ R0 _5 k1 K( D( X. W* K
#040  FillRect(hDC,&rcText,hbrush);' s: d' T" g. h9 Y3 S1 u* @
#041
1 ]: E" A  c" Z! ]#042  //删除画刷.
5 k3 q/ k. `5 N' \5 J. Y#043  DeleteObject(hbrush);
( [! S; Q; L/ }& Y4 c0 C. E2 w#044         ) O: x* @3 ^6 u5 S# @% A8 Q3 k; p
#045  //设置透明背景8 U6 d0 m2 d* F5 C+ K
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
+ {5 @* I8 G5 C4 }/ D$ n. j#047 8 ]2 n; |) V/ [3 j* J
#048  //显示字符串在四边形的中间位置.
$ a7 q% m" d4 w. q3 a#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,& {0 w, @2 u% E. h5 Y
#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
- |% }" R( s$ P4 z. D! }4 ~) b/ e#051 # J6 L' Y& _2 X/ U  C" h
#052  //恢复原来的字体.
( @& w  }2 x2 v+ z, B3 y* H9 ~4 H#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
$ u  @7 X- M. c#054  DeleteObject(hFont);8 @3 \. s. }4 [
#055
  W& V' P9 v" j9 A' B; L#056  //恢复原来的模式.: K) Y! Y+ s( L; ]1 I- |  C  A3 O
#057  SetBkMode(hDC,nOldMode);# x( n! A5 v: V0 [) b
#058
# e% J0 [. ~4 s#059  //恢复原来的颜色.
3 n/ ^/ N( R3 J! I#060  SetTextColor(hDC,crOld);$ X" ~) ^* E2 h+ }  F' A7 h
#061 }5 B3 I7 _' @# e4 F
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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