冒险解谜游戏中文网 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
& @: G) [5 M. B7 z, ]7 b
$ f6 i+ |$ [. p+ ]5 s
/ ]/ ?5 A2 C8 N4 f- T4 [0 B
在做报表里,经常要把输出的内容进行错落有致的排列,让用户看起来更加舒服。比如使用标题的字体输出后,再使用其小号的字体进行输出。这样就需要知道每种字体的高度,才让两行文字输出不重叠在一起,就需要计算每种字体的高度。这时就需使用GetTextMetrics函数来获取字体的高度。
) {1 N- F- G" i0 @8 B6 X
0 ~6 U* T t2 Q: J8 L. Z& a
函数GetTextMetrics声明如下:
_7 g% ]# d2 Y ^9 L6 v1 v
8 B; W* V, l, [& s0 O
#ifndef NOTEXTMETRIC
5 m& s/ {; b6 c" Y+ X8 P% [. s v4 k E
# d( r6 V# G# @
WINGDIAPI BOOL WINAPI GetTextMetricsA( __in HDC hdc, __out LPTEXTMETRICA lptm);
" F4 A- S. o/ C3 R0 M
WINGDIAPI BOOL WINAPI GetTextMetricsW( __in HDC hdc, __out LPTEXTMETRICW lptm);
' ]0 L3 L8 X' b
#ifdef UNICODE
, F3 K0 X* {! g' n, O
#define GetTextMetrics GetTextMetricsW
# X& \0 S6 Y2 v- V6 O: H. s
#else
2 J3 k/ ~( V$ S0 n
#define GetTextMetrics GetTextMetricsA
7 t$ m4 n/ i$ j1 a- r
#endif // !UNICODE
: r' N5 ?$ m; C8 b
! } s3 K" v+ ^# ^) \; l
hdc是当前设备的句柄。
# N) Y% b' ?5 Z0 @/ H6 m
lptm是获取当前字体属性的保存结构。它的结构定义如下:
% T5 o" M1 ?! |( {% M$ N0 a' d
typedef struct tagTEXTMETRICW
- w( G% n5 g" k6 |' y. W
{
T0 I& S9 M* b l" \
LONG tmHeight;
3 I; j D# a" `$ { }
LONG tmAscent;
& ^3 b& N6 U$ K+ W5 R# }& Q# V& C
LONG tmDescent;
. a+ X3 b" G! g/ R. u$ _% G
LONG tmInternalLeading;
. f% X2 a* Z# s* Q8 w& w
LONG tmExternalLeading;
2 i# ]; Z# I" t" I- }
LONG tmAveCharWidth;
- `7 A8 Y, v8 g
LONG tmMaxCharWidth;
8 k; P# J: L# d8 a6 J
LONG tmWeight;
: Y# }7 \- q; \! Z8 q8 a
LONG tmOverhang;
: m A6 w0 K$ O* D& D$ [0 o1 ]
LONG tmDigitizedAspectX;
( Y( u' d8 i, A' M0 |8 _
LONG tmDigitizedAspectY;
7 A! Y# C, q6 `0 p, S1 g
WCHAR tmFirstChar;
0 ^9 c5 f7 L. ~) X* k8 _+ `
WCHAR tmLastChar;
- H# G& j; y, d7 ?* P
WCHAR tmDefaultChar;
2 o( z+ |$ p9 n& K$ \. D: c' ]
WCHAR tmBreakChar;
' n- r7 C6 _8 H2 _! r2 R
BYTE tmItalic;
/ h& y- {4 \/ |* i4 B; Y( S, E
BYTE tmUnderlined;
! C8 a" o3 e9 P6 ^" i
BYTE tmStruckOut;
9 \+ ]: X% v) r0 g7 a
BYTE tmPitchAndFamily;
+ @ B% h; |! |1 K5 Q
BYTE tmCharSet;
, e) ?5 Y. j2 {7 _, v, A
} TEXTMETRICW;
8 j2 Q% t% z6 l9 j6 ]5 h" V
# I8 W" p% ?6 M/ C( `
调用这个函数的例子如下:
) O! u8 _6 x9 u2 R: h1 S( s
#001 //
" U/ g2 P0 y# D% G8 L6 M
#002 //界面显示输出.
2 ~' w" J0 G3 b9 m; A# S' N
#003 //
. {( r3 S" d/ L
#004 //蔡军生 2007/09/06 QQ:9073204 深圳
2 C- x+ v6 B) n; U
#005 //
& i! Z7 w; K8 u5 k9 {! l9 A
#006 void CCaiWinMsg::OnDraw(HDC hDC)
6 x/ }9 i' l* ^9 f
#007 {
! R; `/ W* k7 N' [
#008 //
- L. D3 d: R/ Q
#009 std::wstring strShow(_T("C++窗口类的实现,2007-09-04"));
0 F8 b) j3 L/ P: q" s
#010
- R8 R" O3 E. X2 k
#011 //设置输出字符串的颜色.
9 E* i4 F( n! N+ Z8 B [# X. k6 P* [4 Q( A
#012 COLORREF crOld = SetTextColor(hDC,RGB(255,0,0));
; I5 m9 C M8 g+ _
#013
( c* z9 g+ ~1 C a
#014 RECT rcText;
4 I |# c8 A2 v, v6 _; Y6 j
#015
% ?! \) i; `" }4 o- @
#016 //设置新字体.
; N2 x2 m: ^$ {$ G! Y. ~) f4 p
#017 HGDIOBJ hOldFont = SelectObject(hDC,GetFont());
8 L1 X* u, o: v. \4 i% h
#018
1 d% _5 v3 M$ L! E
#019 //获取当前字体的高度.
& [7 U+ a# \6 G+ i# s( b3 R4 l
#020 TEXTMETRIC tmFont;
* m* ^; X+ C/ ^0 f" @
#021 if (GetTextMetrics(hDC,&tmFont))
; L5 Q: q. x% O& T/ I4 {' V
#022 {
: S: H2 ^, q$ T$ z
#023 rcText.left = 10;
0 d+ s. N( W N2 U% N" l
#024 rcText.top = 40;
/ {, M- G, k) B) P6 e, j
#025 rcText.right = 300;
9 o2 [8 Z$ B5 N$ t- p+ f4 {6 M
#026 rcText.bottom = rcText.top + tmFont.tmHeight;
3 e) R$ W( E7 u0 Z* U
#027 }
. t- r8 v2 P [
#028 else
2 s' R7 C& h5 o4 ?
#029 {
! x( \! ^ E: v3 i' p' o
#030 rcText.left = 10;
; x. W3 I0 m, H$ W6 c: O Z
#031 rcText.top = 40;
) Q$ }: U* V* s; n. P
#032 rcText.right = 300;
) {' V5 S) s& N# h, ]- g5 Y
#033 rcText.bottom = 80;
8 g" c! C3 K( ^3 V& {
#034 }
$ `( {5 w5 q) J3 a# V9 D' }$ \
#035
0 K& i( ? f( N: ~. f+ X
#036 //创建黑色的画刷,
+ t- |/ u1 |) d& |( w4 X0 Z
#037 HBRUSH hbrush = CreateSolidBrush(RGB(0, 0, 0));
; i, f+ ~$ t8 V, `$ K
#038
@5 j7 @$ o6 ~/ E
#039 //用黑色的画刷填充四边形的颜色.
; W% h8 N7 P$ a) c1 X% g5 @
#040 FillRect(hDC,&rcText,hbrush);
/ u. G% f, U, T1 o' h
#041
( }4 ?3 D9 z6 c6 s
#042 //删除画刷.
0 f3 f; E3 f, l+ |. _! X
#043 DeleteObject(hbrush);
; |+ R8 ^ Z5 g% V: Y: i2 X& ^
#044
- N6 S. l6 z; ]% J* J
#045 //设置透明背景
: u$ M8 U1 X% v
#046 int nOldMode = SetBkMode(hDC,TRANSPARENT);
9 `6 E8 m3 b7 E7 }. D7 f
#047
# H$ y! i5 C G( L9 v4 e
#048 //显示字符串在四边形的中间位置.
* ^4 R& p- \& N2 B9 `; |7 {2 r
#049 DrawText(hDC,strShow.c_str(),(int)strShow.length(),&rcText,
: ?) }3 U8 C% p2 \2 }2 I/ q
#050 DT_CENTER|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
! h6 ^( J/ w! m
#051
$ N9 Y4 b# T- w7 Z# E
#052 //恢复原来的字体.
/ Z/ V; e1 n6 V, b
#053 HGDIOBJ hFont = SelectObject(hDC,hOldFont);
' o8 s! I! V G* s7 v: x
#054 DeleteObject(hFont);
p# k F$ G5 y& Y
#055
9 @& _: a6 x( L3 K2 \
#056 //恢复原来的模式.
4 i, G$ ?. I: l2 I
#057 SetBkMode(hDC,nOldMode);
; D( f+ A @' E& j3 J# X! B
#058
) @ \/ J2 i6 g' P6 D
#059 //恢复原来的颜色.
- \$ b% P# m" [5 E' R9 i
#060 SetTextColor(hDC,crOld);
( E5 J4 ~% s4 Z3 }; g0 x! x
#061 }
* l. ?: P: U; E/ g* K
#062
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2