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

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

[复制链接]
查看: 2030|回复: 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
6 M: `: r' d: v: l# m) e' {
. g3 Q$ k& [3 u$ g  N2 V: e1 P$ F% v8 @+ c
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。0 ^& D# J( C- r, c7 z
3 f$ S4 b: |  H4 o
函数GetTextMetrics声明如下:5 n3 {+ x4 E7 Y5 K. E% j$ e

2 x, H  o9 j, C" B( \# G#ifndef NOTEXTMETRIC  W7 s$ F. p" G* {
% j8 K5 R8 `* d
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);! Q& ^+ t" X3 y7 p' ]8 P/ Q  p
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);! e7 v- I$ z! X
#ifdef UNICODE. l1 _* p0 B# q  t
#define GetTextMetrics GetTextMetricsW7 G. w; U7 ^; Z! M
#else
( L- O2 F8 q6 y#define GetTextMetrics GetTextMetricsA
$ {& U1 c" ]7 |5 ?' L#endif // !UNICODE6 [+ a8 r* B* E

" U' s& e" h8 f1 f$ xhdc是当前设备的句柄。
- J( {  ~( S( E$ ^# P( nlptm是获取当前字体属性的保存结构。它的结构定义如下:
$ s+ |3 N% B. O$ Atypedef struct tagTEXTMETRICW' y# K4 H4 U% P( R
    {
, r! d  B5 b+ Z6 S    LONG tmHeight;
. @+ b) h7 |4 l7 o" J& g% I+ X/ W    LONG tmAscent;
6 H: u5 w2 G6 ?2 i    LONG tmDescent;& S* ~: P8 T: }8 O2 g
    LONG tmInternalLeading;
' t+ o) o$ T9 ~/ x8 [* N    LONG tmExternalLeading;6 Z, r1 o+ X( R% D. l8 k& |
    LONG tmAveCharWidth;
7 S* K* o) E$ `    LONG tmMaxCharWidth;
/ u3 D% ?+ r+ ]0 ^    LONG tmWeight;, r) [; ]* Q/ ^
    LONG tmOverhang;
$ s# U  `8 D8 [3 j+ [2 D    LONG tmDigitizedAspectX;
7 \, u$ X# i) |/ T2 h9 k4 z6 X    LONG tmDigitizedAspectY;" p, D# s2 L5 E5 p
    WCHAR tmFirstChar;% I- W, F; p2 O# {. D
    WCHAR tmLastChar;4 c  ]0 [$ k( p8 C
    WCHAR tmDefaultChar;
6 Y& M  s' H6 _, C    WCHAR tmBreakChar;$ x* O4 x2 |; A5 U+ `/ u
    BYTE tmItalic;& y$ a7 X6 f" p7 ^1 H  c$ c
    BYTE tmUnderlined;+ `/ X+ G- e4 E' z
    BYTE tmStruckOut;, v1 ?- S2 u- p9 q0 C
    BYTE tmPitchAndFamily;
$ o8 M. E2 }1 M  X    BYTE tmCharSet;' s& F6 ?: F9 a. D; V, x5 t, f& y5 T1 b
    }     TEXTMETRICW;
+ i- `& Y' _( U6 J! S
7 p# C- M; a1 E7 |; w调用这个函数的例子如下:; J" _. g- r6 X/ b: ~
#001 //) ^! j8 i' ~, S1 H
#002 //界面显示输出.) @1 d3 r. u" B) D( K3 Q
#003 //  N! Y( e, C  I( g+ U+ a  x) I+ K- Z/ B
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
. U; ], `; C- L3 H. I9 |$ X#005 //+ b: A- S; g: f- J' c) X% Z; o* D
#006 void CCaiWinMsg::OnDraw(HDC hDC)9 B& E$ H/ ^0 Q- ?
#007 {6 {. [1 u: L, I% s: @! ?4 z
#008  //7 s& T; H8 m  P' J8 J. b
#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));2 R1 K' s1 u8 |! V
#010  
' s: B! q: c9 s2 D: d% o#011  //设置输出字符串的颜色.
+ p8 u  @- @3 ~; R. u- L" Z8 w#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
' c9 r) S& ^4 Q2 P#013
( c- Y$ X; B' g9 o#014  RECT rcText;    " G$ x% f, }! o! m
#015 * y" O, T& e1 X
#016  //设置新字体.
9 Q, T* H8 a3 J/ \, e5 i#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());1 L8 A9 A9 m/ p3 J! |
#018
: l  Y5 d3 `: \  X. I& \" ^6 b1 Q#019  //获取当前字体的高度.
7 P2 X  @8 o7 \' m, v: \  {9 Q#020  TEXTMETRIC tmFont;
. Z9 T! f! Y  o7 N! c  V  r0 l#021  if (GetTextMetrics(hDC,&tmFont))7 k% F' V8 z6 a6 _
#022  {
+ s( ^1 _( e& a4 h#023         rcText.left = 10;
$ j$ s: D: a6 p# t, B  D#024         rcText.top = 40;
1 a( ~7 \& ~( v5 [; w#025         rcText.right = 300;' f1 W' V+ q* P% t7 u& H
#026        rcText.bottom = rcText.top + tmFont.tmHeight;    ) J/ d) n- |) d. ~7 M8 ~
#027  }# [$ w$ n3 j+ f+ t7 `& C7 D
#028  else
1 B$ l: t/ ]  C) |: N#029  {
; S* P. L  Z$ U+ n9 B8 @#030         rcText.left = 10;; \7 F- K, u7 {+ Q
#031         rcText.top = 40;* g+ h: o* t) U5 X3 B/ U
#032         rcText.right = 300;8 F9 t, |. T+ Y" Q  G
#033         rcText.bottom = 80;
- r) V+ V. |4 s" h2 l#034  }
* R. z" m" U4 q0 j- B( j#035
6 G( V/ W+ K% h/ H#036  //创建黑色的画刷,
: U) ]  I/ I+ F: `! i, E#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
- t9 j8 a+ T/ V& k$ {* d; V* T#038 4 W6 n4 i0 X3 o4 l1 W; g: f3 J! `
#039  //用黑色的画刷填充四边形的颜色.$ F6 d8 @3 n: w: W4 m' B( A
#040  FillRect(hDC,&rcText,hbrush);
2 ?' K6 Y" Y( W, Y: ~$ p! f' B0 ?#041
) v# D5 r8 m/ Y6 Q#042  //删除画刷.
" i& I& W- `0 y#043  DeleteObject(hbrush);$ N9 x+ y- L; y+ a! b, Y
#044         . u: R3 N9 z4 g' z6 c. m
#045  //设置透明背景+ z$ ?2 r3 R  o8 g( k( N2 w
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
: ]7 e+ F' v. U) a#047 ! f8 y# r% P( z; [+ w9 S: r
#048  //显示字符串在四边形的中间位置.2 s  N6 `" Y( @  G
#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
' i5 a# r+ _$ |6 Q& [0 O#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);. r, a$ [( U( Y+ n+ m" s8 f0 t
#051
2 ]& y* F2 g$ G% O" H* F#052  //恢复原来的字体.
  _. y, Q/ U: O8 U#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);) D5 Z2 S1 g! r
#054  DeleteObject(hFont);
) V4 K$ r5 ^" {+ j8 q#055
! S1 y1 c2 x: V* q#056  //恢复原来的模式.
8 N, q" T- Z+ a. D1 T3 [. n# `9 O, P#057  SetBkMode(hDC,nOldMode);
5 [% D: }* a/ [  S  ^7 D  R#058
) G; g6 [, }" ~% r#059  //恢复原来的颜色.
, u/ N) O# c2 b& S. p% \5 g#060  SetTextColor(hDC,crOld);
9 e+ f4 A, ~5 g. s* M8 R: ?#061 }; C7 i# }& T, p% A4 H
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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