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

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

[复制链接]
查看: 2058|回复: 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- A4 w: ]' ^4 |! S& \8 E7 f
" T" M  D: B8 }

9 B) {& K9 h# s$ a" C6 I. u) |# d, Y在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。& o2 a+ W+ u& r% Q6 r% Q5 d! ~3 t* O

& M# X9 p' [+ E/ H函数GetTextMetrics声明如下:5 M% _5 v/ l$ W

" O& b* D- ]$ B1 V#ifndef NOTEXTMETRIC
! x. _& Y6 O( ?4 A
, z3 w7 k. _1 k( |WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);, j2 m% S3 i& M
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
' r7 O3 ~4 e# S$ e8 I#ifdef UNICODE0 ]! R, u' f  a1 E9 d4 e
#define GetTextMetrics GetTextMetricsW
/ _* l& m8 r8 @- h) i" G( z#else+ v! }! e4 A7 O5 X6 a
#define GetTextMetrics GetTextMetricsA
. P# x4 W5 @6 Z* b" g#endif // !UNICODE
+ q/ R0 w+ k9 [/ g , U  y0 a. e: s& o% c
hdc是当前设备的句柄。
2 Q  b2 w' C5 N8 G* g2 Wlptm是获取当前字体属性的保存结构。它的结构定义如下:
1 ]& I; O* X$ p" b2 vtypedef struct tagTEXTMETRICW
# r( R: e$ ~( [; R9 B3 @7 F    {
' w1 H2 K$ h. a/ M    LONG tmHeight;
) Q' F- s( D6 J. Y2 L  I8 L    LONG tmAscent;
) A% g- D# Y1 O$ F. u! x    LONG tmDescent;  i+ w) }4 F" B) N" @
    LONG tmInternalLeading;
9 C9 M' `9 F  n4 {$ N    LONG tmExternalLeading;4 M5 ]0 u$ q  Y$ r1 W
    LONG tmAveCharWidth;# t4 \4 U' B. C; u% U. [
    LONG tmMaxCharWidth;
5 @" w7 ]- X- D    LONG tmWeight;9 r4 A( ]- \$ w+ X9 F' s3 F/ x
    LONG tmOverhang;
0 i& a: L8 ]- I  V+ z9 d3 `9 F    LONG tmDigitizedAspectX;( k. {/ J; D& @+ f" L$ J
    LONG tmDigitizedAspectY;
; [- }0 V2 E6 t7 X    WCHAR tmFirstChar;3 z* R; o3 S* U7 Y% T) _9 ~
    WCHAR tmLastChar;
. F$ a( b5 Z& a    WCHAR tmDefaultChar;( m1 K, Q$ g) m" z& H4 r
    WCHAR tmBreakChar;" J# R$ |% S7 ?
    BYTE tmItalic;4 W! I% _( s: ]% U! d3 f* A$ u* g
    BYTE tmUnderlined;2 s) a& s! k, ~# z/ B1 i
    BYTE tmStruckOut;6 l) `1 M2 s4 p! X
    BYTE tmPitchAndFamily;
+ U$ H4 D8 y7 X  {% v    BYTE tmCharSet;
$ \% c% r- {* v    }     TEXTMETRICW;
2 Y. M" F5 J& `
7 u9 c# {( f$ _6 k) G# B/ y调用这个函数的例子如下:
! ?# C. M$ Z) C, _#001 //
6 F* E5 P7 t  U9 w4 Q) N$ I1 x#002 //界面显示输出.
; z+ y: V4 U( v; O( U3 _: X) T+ h#003 //
. @9 p' R$ ?* w' h) X9 [- ~% J#004 //蔡军生 2007/09/06 QQ:9073204 深圳
3 A, v1 i8 h8 G#005 //) Q, z/ G( \6 a
#006 void CCaiWinMsg::OnDraw(HDC hDC)$ k$ T& H, M( M; k  M
#007 {
3 T) N6 A) [+ Q2 c2 D- G$ {& @#008  //
6 ]/ p0 ^4 W0 g+ b7 Q#009  std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));, Q% U. z; m- O& L2 |0 a) p
#010  8 [6 \4 o, I" r
#011  //设置输出字符串的颜色.
5 f8 u0 h4 Z" |#012  COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));7 i( w! O5 e1 c
#013 * x: I; D0 v! j; S; L
#014  RECT rcText;    6 B  G6 |& K/ R( Z- y3 P  n
#015
0 {9 ]$ f  r9 {$ L4 a! K#016  //设置新字体.
2 G2 g! ~. d$ ~4 w  A1 S+ y#017  HGDIOBJ hOldFont = SelectObject(hDC,GetFont());9 A+ r( b- [8 d  O
#018 $ a6 G6 z, v% a$ u3 p/ Y
#019  //获取当前字体的高度.
. D# H4 l2 B+ P: ]#020  TEXTMETRIC tmFont;
- ~0 S2 p* n9 Z#021  if (GetTextMetrics(hDC,&tmFont))! i5 O# D! e2 J8 J
#022  {
& B. M) x3 B( B( U#023         rcText.left = 10;4 ]/ W$ P+ Z+ T, J
#024         rcText.top = 40;1 S/ o. U6 `* Z0 |6 Y1 I
#025         rcText.right = 300;9 H4 S2 N- b) X( j
#026        rcText.bottom = rcText.top + tmFont.tmHeight;   
' i- u3 _/ F: D, g, q( _) Y#027  }9 @) Z- S& u/ y1 K
#028  else9 n! X3 y4 v" X" R* S7 x4 f
#029  {" o. ]6 w; D8 U! G
#030         rcText.left = 10;
/ C) c1 Y1 {$ C" I#031         rcText.top = 40;
% x! Y, K% ~" ~8 L, O( x#032         rcText.right = 300;! ]) D& X# T5 j( |2 c& R
#033         rcText.bottom = 80;. y0 L" y. O; r9 a
#034  }  a+ v, Q! u4 p: P1 X
#035 & N( G2 o  h* R" {! P9 C1 {
#036  //创建黑色的画刷,
) g' l; _7 f) A+ b$ h+ ?#037  HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));: w$ E8 O  r9 n' z) Z, R
#038 8 u* Q3 ~" t7 f- P+ u
#039  //用黑色的画刷填充四边形的颜色.9 {2 X+ X7 M7 D" u( u; r# o5 \
#040  FillRect(hDC,&rcText,hbrush);
$ d. O' e6 u0 H; e+ w0 W; \#041   T, `0 p- e$ q2 q1 {4 S/ H
#042  //删除画刷.
- ]- V4 O6 D: p! {  z% [& m#043  DeleteObject(hbrush);3 t  K5 k' L! @3 l" P) Y9 B$ {
#044         & j# u- ?; c. H- N
#045  //设置透明背景
) y2 Q5 a5 I* B% `4 o& H$ {9 Q# @#046  int nOldMode = SetBkMode(hDC,TRANSPARENT);
7 C' @* [/ K' a' p2 n* Y# U#047 3 z' K( T9 v* e5 i3 m
#048  //显示字符串在四边形的中间位置.
* A6 r0 K  T! N# ^0 j#049  DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
8 u( A4 J9 w% D3 i5 T#050         DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);) G$ @; O/ h4 i% s: i1 {# K
#051
4 I) P; T6 E0 E* ~5 n9 f+ j1 ]#052  //恢复原来的字体.7 ^8 ]& t) b; _/ I
#053  HGDIOBJ hFont = SelectObject(hDC,hOldFont);
9 H. L6 Z$ z* X+ T. A3 i#054  DeleteObject(hFont);7 f  x- v5 J3 j6 Q! _, U
#055 7 ~9 D! u/ M: X! C+ _
#056  //恢复原来的模式.
1 B+ z" @+ f. p2 y% ^& e0 X#057  SetBkMode(hDC,nOldMode);1 p4 u; y. D* P0 e# A9 ^+ I
#058
: Z) T. _9 O+ k#059  //恢复原来的颜色.  V7 }; J9 m. I& m  l5 J
#060  SetTextColor(hDC,crOld);
7 h9 B; z1 G+ K5 ]; E0 L#061 }8 v! t/ O# M( m" N
#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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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