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

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

[复制链接]
查看: 2050|回复: 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% S, w4 K0 N9 ]' g* Z* Y
8 m( a( \7 v  d4 C

2 U2 _, N- j# Z在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。" ?. O+ ?: ^# i. a' F" D$ ~  @
& b% ~; h, A2 o3 w0 [
函数GetTextMetrics声明如下:1 k& Z2 v, k2 }8 w
' N$ k8 |/ C4 c, @7 {: A* r, r
#ifndef NOTEXTMETRIC' r  W# S9 Q9 s! S

/ e' m9 W$ ~1 o; X+ e7 M, y) tWINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);7 J1 P1 i, k/ Y$ c' \
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);% R7 W* c/ ^2 _4 l7 R- l7 v
#ifdef UNICODE
4 z% ^" |1 [! d2 A) {#define GetTextMetrics GetTextMetricsW
: S; k' O6 D4 z4 _. p#else
$ U; `  |0 I$ L' K8 K1 g; R: F#define GetTextMetrics GetTextMetricsA
+ t8 J, V) S: v; U#endif // !UNICODE
6 c3 y* m/ T) ?1 o7 m9 y
* y6 P, j5 ?; I: V5 i6 @hdc是当前设备的句柄。/ q, Y8 W3 }+ Z  @/ z# q& m
lptm是获取当前字体属性的保存结构。它的结构定义如下:7 V8 z# x& H6 P9 x; j! T
typedef struct tagTEXTMETRICW
; Q; o% t' y$ H: g8 {- s4 U/ W8 s    {) {  v; e# ?% t& L' i( z
    LONG tmHeight;
9 x# s% w* i0 q' M% R9 K    LONG tmAscent;1 I9 H" V9 a# _( \0 b, Y
    LONG tmDescent;5 C; M8 N  z. g. o; n, O
    LONG tmInternalLeading;. R( d0 U+ K$ J# k9 y
    LONG tmExternalLeading;
+ {7 i& `2 k2 F* E  P    LONG tmAveCharWidth;, w' ]% X6 ?, y8 L) e
    LONG tmMaxCharWidth;
" u9 ]5 k3 @  R0 T0 q& S4 v    LONG tmWeight;6 D/ i% x- P; H
    LONG tmOverhang;
* W2 O9 [! q2 V    LONG tmDigitizedAspectX;
  \6 z) @7 v0 K    LONG tmDigitizedAspectY;' V. x; Y# ^! J
    WCHAR tmFirstChar;
/ H) s: o& m7 z' w" T    WCHAR tmLastChar;3 }6 X5 Y$ `  R7 @& [2 h+ [
    WCHAR tmDefaultChar;
& i3 p- I: |" V! R" \    WCHAR tmBreakChar;
& J8 \! Q0 K- K, n/ }- U% R1 c    BYTE tmItalic;/ [  J9 P, Y& Z9 ^! @  ]" e- a
    BYTE tmUnderlined;
, `/ x1 Z- _$ e: m' m  W    BYTE tmStruckOut;
( H) a5 `$ ]& f( M    BYTE tmPitchAndFamily;4 z3 `. A$ q" i/ l: D0 W9 Q
    BYTE tmCharSet;2 I4 s0 c/ C1 q( t& S/ X0 E
    }     TEXTMETRICW;4 ]. E* h/ @5 r" `1 ^3 H
* j: h* ~: C: K  B, g+ \# g
调用这个函数的例子如下:
! c. T# V- L% e  b; X#001 //
" Z1 y+ d3 V) P7 R  m7 J9 _. F1 j#002 //界面显示输出.5 u( X5 ?* N/ K: w/ d, ^, v
#003 //
& _# Z. z' v  T& k2 I#004 //蔡军生 2007/09/06 QQ:9073204 深圳& h% ^$ K8 R' A/ E
#005 //: V# t- P/ X% I) W# g; N0 |
#006 void CCaiWinMsg::OnDraw(HDC hDC)7 K6 b& y' {7 K4 @/ L1 h0 {
#007 {
1 A" F: }7 x7 m; F4 b#008  //8 e- U# x& i5 ]( y1 z0 d& [
#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));+ I' Y" A2 Z7 ~) c0 w( a
#010  & M3 U. u: p6 C$ z/ H9 d* Q! C& I7 Q
#011  //设置输出字符串的颜色.
. v0 [/ _) d& Q#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));% H, ^0 Y/ D' U& @; E
#013 6 {# X  G+ V. h: D
#014  RECT rcText;   
( T8 _5 F/ y4 g# v/ R0 w#015
% V5 D4 r% O1 ]$ I9 V7 ?#016  //设置新字体.
# ^" l1 y  T7 K7 i6 D#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());, i) v# O- ~) {9 w" E
#018
' T# G# {- p9 [1 V#019  //获取当前字体的高度.  j1 A% ?" r; m2 K' t$ e! a$ B
#020  TEXTMETRIC tmFont;
" D  ]$ a) |$ l/ D0 B! s#021  if (GetTextMetrics(hDC,&tmFont))8 I  b. t7 A6 {$ g
#022  {
# b6 J; e  E* z1 v, T#023         rcText.left = 10;  R4 u: t' |" y. M
#024         rcText.top = 40;
: w7 P  M: s, Q4 W* U#025         rcText.right = 300;: S* C0 ~. `6 C
#026        rcText.bottom = rcText.top + tmFont.tmHeight;    - o, t5 k7 h4 y1 N4 Y9 @- |' z5 d) |
#027  }0 Y) W- n9 ~# V+ b5 T* D
#028  else
! n$ V/ `# f7 u, t#029  {4 F& e  f3 A; P0 Z6 ?! Y2 M
#030         rcText.left = 10;
2 r# \  d8 ?( H- l3 O3 }#031         rcText.top = 40;1 d: T; S7 U! d- g8 t" k
#032         rcText.right = 300;
7 x8 C3 @, R- W0 a" x/ w- M1 d1 U#033         rcText.bottom = 80;' h9 @: n' S: ]; U9 a& m
#034  }6 M. S) R; D3 E% N  L
#035
0 g! n- r2 b) r#036  //创建黑色的画刷,
) @6 s) Y- x+ `, m0 m( K  O#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));5 P. n; l4 O" d- I, O% w
#038
. |5 M+ Y. i  @/ {& A6 k7 G, ]#039  //用黑色的画刷填充四边形的颜色.
: `* M4 w& G; U# R9 c#040  FillRect(hDC,&rcText,hbrush);" T* S* i( q+ ~
#041 2 z5 z% X5 F4 X) g1 u1 U7 }
#042  //删除画刷.
0 [$ p. \) S! m( z' `" O7 B6 `- s#043  DeleteObject(hbrush);$ s9 T5 Y5 g. ^+ a$ }5 A
#044         
% m8 c  x0 S9 k, m8 d) U  F  q" k#045  //设置透明背景+ P! v+ F( r* P  ~+ ^) W. o
#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);* U6 F+ A9 R5 b
#047
0 J, Q( A, D1 A9 W#048  //显示字符串在四边形的中间位置.
* U  ^  [4 L, F2 _/ }2 A#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
" O3 d  s2 D1 v; {  G#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
0 t. m1 b- B! Q4 }#051 ( m5 J$ n2 j, X+ X1 J% g7 F% u, U
#052  //恢复原来的字体.
" p7 r7 Y5 `3 H* }  y#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
1 J6 s6 n/ i2 M$ N& c8 @#054  DeleteObject(hFont);" `( B+ `: A/ Q
#055 1 j: l% l! \$ f9 Q8 s9 t
#056  //恢复原来的模式.
3 n: w/ A. }+ `' Z4 \1 C#057  SetBkMode(hDC,nOldMode);
8 I4 \6 `* A6 a- {' ?6 x4 H2 a#058 9 y9 A' p  N/ k7 {7 B4 t
#059  //恢复原来的颜色." v9 s* h& _( O
#060  SetTextColor(hDC,crOld);
$ ]% n: D' @/ c& ?+ R#061 }( @0 j' t' S8 L  Z7 O
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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