冒险解谜游戏中文网 ChinaAVG
标题:
【汉化资料】Windows API一日一练(30)GetTextMetrics函数
[打印本页]
作者:
shane007
时间:
2009-1-20 20:48
标题:
【汉化资料】Windows API一日一练(30)GetTextMetrics函数
http://blog.csdn.net/caimouse/archive/2007/09/07/1776661.aspx
% l: N! x1 q9 ^7 m$ o9 O
7 p- ?) }) g6 _7 L! X5 g
- s- ]+ }& D+ d
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
; t) q# p* x$ p* A7 y9 ]/ ^6 a
( u1 \' u+ }7 V* ?
函数GetTextMetrics声明如下:
* P+ j* _, z/ {" x
* L0 [( J- B) L; U+ P( B
#ifndef NOTEXTMETRIC
/ J7 t: c) C6 G/ N$ m
) e7 u) A0 Q5 O& Z* H j1 N% G
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
$ N0 g1 M; i- k0 X
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
$ _( d7 z" H; D
#ifdef UNICODE
2 d) I& }; j8 s0 B! o/ o% L. X
#define GetTextMetrics GetTextMetricsW
* \) ~7 @$ x1 {- `. t0 |4 x i+ M
#else
+ z( n6 ~; B' J7 `) n4 F
#define GetTextMetrics GetTextMetricsA
! I+ m& y$ j9 ]0 n' b
#endif // !UNICODE
- U" z" d& k. ]" R
{+ h% O' [$ Q, B- [3 p
hdc是当前设备的句柄。
: e f' l; @, ]$ @" b$ G
lptm是获取当前字体属性的保存结构。它的结构定义如下:
* t- `8 p" v4 Q( w( X, j) k2 @
typedef struct tagTEXTMETRICW
7 }1 ~4 G- n" w& K) Z: N
{
+ H+ ]3 ]9 N9 y5 s5 ~
LONG tmHeight;
* z3 e% c0 k$ D" e$ k
LONG tmAscent;
1 a3 L; \1 Z7 K# d4 ?2 M
LONG tmDescent;
) {3 c3 x' z5 ~9 Q+ Q- h
LONG tmInternalLeading;
8 v0 @& u1 v3 \7 i
LONG tmExternalLeading;
3 g. m' [+ e, l. f6 U% y& ]! P
LONG tmAveCharWidth;
$ W' ^" f! J# [- x) t
LONG tmMaxCharWidth;
# n5 H0 d$ x3 N$ i, [. [
LONG tmWeight;
3 q5 m' ?: Q3 d$ m0 t8 M) [* X
LONG tmOverhang;
1 ^4 J2 s( ^7 t4 S8 _
LONG tmDigitizedAspectX;
# i$ ~" U# q( O. u8 u9 _2 A
LONG tmDigitizedAspectY;
1 `3 W% {" c$ Y9 ~. K$ e
WCHAR tmFirstChar;
$ ^' }% }6 K; O. b/ @, d+ q
WCHAR tmLastChar;
e) [8 K9 ^+ X7 O. o# {7 I
WCHAR tmDefaultChar;
9 R( T2 U* W" G7 r |! b8 \
WCHAR tmBreakChar;
$ ?- a3 C3 u, l; _
BYTE tmItalic;
- B: U0 y7 `& k( S
BYTE tmUnderlined;
) E; ?6 R0 N1 }$ q# J9 m
BYTE tmStruckOut;
) ~2 D7 S0 [& j( p$ \% R3 Y3 }
BYTE tmPitchAndFamily;
8 @ E0 t8 j6 a& e6 L+ W
BYTE tmCharSet;
/ h5 \) ]/ u5 z8 b7 ^5 ?" z# s; Q
} TEXTMETRICW;
5 Q+ E. u/ e2 h2 ~0 ^! g
% k6 e. g$ B. U
调用这个函数的例子如下:
& p2 ]# d4 D. V# ^9 ]
#001 //
% P- `; y! u+ v3 a( u) B
#002 //界面显示输出.
& J+ K& U0 _1 j+ `
#003 //
" t: y- C @% e' O" H
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
) o8 P; R5 [* d2 D4 `
#005 //
* A/ T( W$ [1 d
#006 void CCaiWinMsg::OnDraw(HDC hDC)
, D1 G! a' Q' @0 Q
#007 {
. K8 o) z( N h% M5 N9 S
#008 //
9 ]( K) \) M$ g2 G& \
#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
4 l( _+ ~' |' l8 x0 y, k
#010
4 Z# A' Q' P; [+ S0 c% y, X
#011 //设置输出字符串的颜色.
- O( k; N8 j# H1 l- _/ A
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
! q1 T9 `( l& Q9 _
#013
6 C8 ?, R {( _
#014 RECT rcText;
+ b. E5 V/ Z$ K/ ?' I+ s
#015
* h+ c$ I, G3 q, P1 Q! x
#016 //设置新字体.
/ S& ~1 Q: k+ z
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
# c% Z1 b# J. B( z" K& T+ J
#018
- m: b% h* T6 }
#019 //获取当前字体的高度.
' j& s) c( S9 @" _
#020 TEXTMETRIC tmFont;
: k6 I5 V1 y8 a: _- j- |
#021 if (GetTextMetrics(hDC,&tmFont))
8 N0 x/ |$ D6 y5 J% N- L
#022 {
+ ^9 a9 M# {$ K/ R7 O
#023 rcText.left = 10;
6 u$ p5 T% ]- b2 e+ x% X5 Y2 ]! L
#024 rcText.top = 40;
% k8 @2 r w( W3 [& W Q) u
#025 rcText.right = 300;
# m: b- a3 E9 b# _
#026 rcText.bottom = rcText.top + tmFont.tmHeight;
0 P! w% n% i: O% F
#027 }
b' l% y2 B- A! O% m& r
#028 else
. A$ Y5 s& U( f+ D" T6 ^$ m
#029 {
( L9 e Q* }2 J0 p) l2 L: J
#030 rcText.left = 10;
: c" [ k/ t8 S" m [" Y1 Q
#031 rcText.top = 40;
& R! t) p6 D7 k- _
#032 rcText.right = 300;
6 T. h) ~+ j2 p
#033 rcText.bottom = 80;
6 x/ Y ~1 w" @/ M
#034 }
9 M+ |7 `* X8 d3 |# T
#035
, B" ^; }0 L, P
#036 //创建黑色的画刷,
7 U- g W3 |' a+ b; ?' W0 i
#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
* W! T# o% \. G' X$ q, Y
#038
- f/ a$ @- `7 F7 y+ F
#039 //用黑色的画刷填充四边形的颜色.
; a/ _4 N9 k Y( N( {9 v
#040 FillRect(hDC,&rcText,hbrush);
9 S6 } O5 d' j# r" D# _9 |6 f
#041
* w2 `2 q$ |8 V7 d7 M
#042 //删除画刷.
- L. K N( x0 o- f& e( F7 N7 P* p! l- ^
#043 DeleteObject(hbrush);
: V& `1 i" [9 K1 v a
#044
) S4 J: x2 a9 z
#045 //设置透明背景
% O0 P+ c" p. f' ]9 l) K
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
( Z; e5 H9 @# v5 o6 m
#047
7 a( `9 ]8 e* K j
#048 //显示字符串在四边形的中间位置.
7 K' _! N1 p( h
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
( O+ `( @, }. {7 g& @( M l- N8 i
#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
, B) c" N! a& x2 ~4 v4 p/ `3 _# q, S
#051
3 ^ Y1 q9 T! q' M; \
#052 //恢复原来的字体.
) K. C# B# |0 y3 C4 r- K
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
- f. z3 @$ J b: l6 R
#054 DeleteObject(hFont);
! W/ |5 B' \" g
#055
- q$ L! S6 a0 {1 @+ R/ l4 c7 x
#056 //恢复原来的模式.
3 J* Y: N; e5 N6 w2 c
#057 SetBkMode(hDC,nOldMode);
4 K! ^7 H1 n2 j) |, |- P
#058
. _* i6 ?" ^- F& T* A
#059 //恢复原来的颜色.
$ Z1 G. ]8 W0 d
#060 SetTextColor(hDC,crOld);
0 \. \9 K& N1 E
#061 }
. C( [0 x3 N- P
#062
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2