( e! [" U- S: Q/ F6 Z4 x; V; D 如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在联机帮助中找不到它,它在AFXPRIV.H中半文档化, 在以后发行的MFC中将文档化。8 B0 v$ S$ Q2 u& E1 k4 D* ]
AfxSetWindowText的实现如下: ; S3 Y5 I* l' x) I" |5 w8 u* h0 A0 I: P- Y2 C' E
7 y. A- d" z$ s! o: T3 v
9 M8 w$ r, p! s% W
* O, Q/ o7 i o7 ^" F
voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew ) 7 h4 z2 s* {6 b( r: _9 y0 M ]0 X { ) x3 Z2 E" D, ]/ O5 V9 d+ Z. Q itn nNewLen= Istrlen (Ipaznew) ) y H( @* R2 H, | TCHAR szOld [256], p2 S5 |6 @* h8 n: J# C
//fast check to see if text really changes (reduces+ K; z- ^5 g( Z) ]. x
flash in the 8 ? F- ?6 B0 v+ I+ q' u controls ) * \. u3 o" c/ C if (nNewLen >_contof (szOld) 6 I. l! R2 X! ~: Q, q8 z0 W; { || : : GetWindowText (hWndCrtl, szOld , _countof (szOld) !=nNewLen4 B. C! c/ c% R5 `7 j, _1 O
|| Istrcmp (szOld , IpszNew)! = 0: m9 Q3 z' L8 ]$ `1 b2 K( g
{9 i1 m- X: ^; ^) ~
//change it ) p) f0 _: E: V : : SetWindowText(hWndCtrl , IpszNew )( I* E$ v6 a5 m1 O, _$ ^9 Q
}) G; G p7 {7 J7 E
} . |/ Y, R" {# O ~2 V 9 x( C0 E: b% ~# r5 u' u (20) 如何防止主框窗口在其说明中显示活动的文档名 ) \2 ^0 j8 K# J& c6 A3 U' q, a 创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名, 必须禁止该风格位, 可以使用ClassWizard重置 7 J( |# u+ V: s) W/ e- M! H& O CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。 0 [: a2 T; i0 V' i: G. {. E, q! [8 u2 ^* ~( ~3 ~/ _7 q
' W$ l8 E% @6 J- |% o
B" b. l7 S/ L/ \+ L, v h( z $ C0 A! q+ ^7 Z# t6 n& u BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs) B) S% k4 n4 M" B/ E2 u L1 u% m
{ 5 k+ \6 [' G: F, g% d1 A //Turn off FWS_ADDTOTITLE in main frame . C `+ v8 C' v cs.styel & = ~FWS_ADDTOTITLE 6 O' t# X( j" k$ d- N, ? n2 k
return CMDIFrameWnd : : PreCreateWindow (cs )8 t5 F( a- j: U
} 8 Y- y; `% C2 y! l# ? 1 W8 L& J1 |1 [ $ I* C, K/ q4 E3 L 关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。) `( o- \ C3 D9 z) ]
: C( w7 d2 r) l. I
(21) 如何获取有关窗口正在处理的当前消息的信息4 N7 }2 r) a8 S* _# l" |
调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage来确定所选中的菜单项。( v, y: n( O$ _2 F2 m
' Q' N) x8 E' V# r' b n) s$ f. ^3 E6 j : v- Y9 y$ }2 @# Y' N7 r+ Z& h * K, i: c+ L8 R; g% B' [$ p/ j, D @; o% T4 s
viod CMainFrame : : OnCommmonMenuHandler ( )' I8 B; X: R, X5 F; U
{ " T0 M: r! `3 m& S6 _ //Display selected menu item in debug window . + w. h$ L& C% ^! p TRACE ("Menu item %u was selected . /n" , $ p* i6 _6 C/ a$ [ 6 t& l* O: q( M (22) 如何在代码中获取工具条和状态条的指针4 h6 y( p" p; O* x: a" Q6 ^
缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说明了如何通过一起调用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口的指针:- j% H3 I* ^1 b
- M) T5 c, z# \7 s% M Y
3 ?, K4 A! H: B5 {# v" H 7 m# R8 j* V9 ?8 ^: K, i ; R+ j Z Z* H! K3 ?4 d$ D //Get pointer to status bar .' ]$ @6 c) z# D) c- R! X9 f6 f
CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )( n( n8 Q" a- H4 Y
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR) % v/ }3 W/ A: P% v4 W- n& o# x: h8 T8 X3 Y2 n, ?8 _
//Get pointer to toolbar .5 { p" Q# G! W
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( )0 k S* v- l+ c& @/ o) A
—> GetDescendantWindow(AFX_IDW_TOOLBAR)! T- J2 b3 S. I; d; I; v" S/ F/ c2 f" }
% Y: T* b( X3 e5 X0 H, }+ H
(23) 如何使能和禁止工具条的工具提示# W! d" C# S9 T0 P
如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数: ! D# t% P# x% B% @) k8 [& X; i* [0 |9 k* Y9 e# }- {
" I, k9 s8 A5 I, ]5 M" ?! }! T- G" X+ j3 M$ c, [
5 B( B2 o, D2 M$ Y; K) N3 I5 Y
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )' H) ~' w8 u/ b' M* }: g8 V
{" ]( ?- O# K: E& p
ASSERT_VALID (m_wndToolBar)2 m- R! @8 V. a F$ v- @# `
* Q% z) D1 E! e6 G DWORD dwStyle = m _wndToolBar.GetBarStyle ( )9 G) H# h. O7 d+ j
- f6 \" f0 w' a: U+ w# X1 d' J2 w) _
if (bDisplayTips) dwStyle |=CBRS_TOOLTIPS4 O) N/ L- O; C4 ?( k3 j
2 l1 S8 U: n' f else h. d8 K5 ?; g& m& R5 R# L
dwStyle & = ~CBRS_TOOLTIPS8 y& X. c, S# H* ]! x: N1 X# C0 i
$ G& `- Z1 _2 K0 [9 w. y. C, b; z
m_wndToolBar.SetBarStyle (dwStyle )7 R7 W9 Y9 m1 E/ D0 t; p' ~
} 2 L" n8 p0 N' f0 Z8 d. }* _5 M/ [, y' d
(24) 如何创建一个不规则形状的窗口 8 s5 R3 y$ W4 j0 T 可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。 使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。6 g* g. d6 E5 Z8 R, a7 u5 d* [
给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。 0 X# b+ R# y( m, J ; k! v. D: Q1 P2 R/ ~( e( O: }9 Q9 L ( c: x: D! r* V! f) z( \ / k# M8 t( K4 T8 q , ^* R9 q0 L2 [3 ^" [ Class CRoundDlg : public CDialog% U% Z8 b( V, ?# u
{& L9 T |) |, Z. V% \! h4 K
…# R9 ^4 M& ]. J, G: O0 N
private :2 a# R: \$ F+ b3 r% }* J2 f
Crgn m_rgn : // window region- f S( f5 x4 _) K t$ h9 U
…. m) x' x0 N1 O8 f
}+ r5 b( `, X" |) B4 |( Z# G2 K
修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口: : N$ {& J* n6 \1 n# M6 @ BOOL CRoundDlg : : OnInitDialog ( )8 a6 u5 K3 |/ a
{ 8 d$ b) P8 V! [ CDialog : : OnInitDialog ( ) + [ F/ d& C% _9 g$ z1 z f6 B ) \- ~7 Y V \+ @ //Get size of dialog .' V' K, \6 B4 ]3 O: M0 n
CRect rcDialog& e$ a0 W* P% ?3 v* A: f
GetClientRect (rcDialog ) 7 Z: S! `* |1 b" S7 v5 f . @2 w. A5 {% ^4 R1 S2 {7 n4 S // Create region and assign to window . : }1 W8 H, g( C; w8 h, P m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) ) 6 n5 w% L- Y5 i L SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE )! b+ y: E+ k( Y- d
* k' t3 {% G/ R8 |3 S
return TRUE / e. z1 E* ?: r; n: } }+ v0 O0 V. g f6 V' \% H+ [
S0 H/ f/ H6 J# \$ p4 i 通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。 5 i. v) Q( P- s" \( ~4 t 6 s( w6 ^: {+ l- {/ K) N6 M8 X# J3 `4 f
9 L- `+ E. Z" B" [7 C % n1 d1 J7 m+ e voik CRoundDlg : : OnPaint ( ) t& k3 G8 S/ R8 U* T+ F2 O* g
{' R' E" P. v/ l3 J/ W6 q
CPaintDC de (this) // device context for painting4 D! D! T W. g$ |
.2 N2 g6 F3 n0 L
//draw ellipse with out any border q' K+ @! A/ s/ I: I" f: Z dc. SelecStockObject (NULL_PEN) 2 Z3 ^" x, s2 [! F# E( g( q //get the RGB colour components of the sphere color 6 q8 g) { z+ J* I& j; \ COLORREF color= RGB( 0 , 0 , 255) + y' t! p2 G6 t# g' ` P BYTE byRed =GetRValue (color)$ c7 b/ e# a8 M {$ T2 | |
BYTE byGreen = GetGValue (color)7 d& e& ?% R8 m' M6 W
BYTE byBlue = GetBValue (color)9 s6 K k: g( S# X# n7 G* t/ Z
( ?8 L9 O; B% l( D. H4 r
// get the size of the view window - Y9 P0 c- R4 Y/ V- h- Y Crect rect ! X$ V- p. {$ |; s( I GetClientRect (rect)! F6 m, N g, v/ x5 T+ a
4 ~" ?4 v ]+ r# ^$ ~9 O // get minimun number of units3 U5 F. M/ e, a; G
int nUnits =min (rect.right , rect.bottom )+ @' n( }/ t: T0 Q- w2 {. O& {) `
5 ?7 s% t8 D/ ~4 [. L% h
//calculate he horiaontal and vertical step size8 R" ?# l# r) O* M$ s# w! `8 i
float fltStepHorz = (float) rect.right /nUnits. ?* z% S$ L) V( h2 O
float fltStepVert = (float) rect.bottom /nUnits / [' z! k1 y* j% @" i/ { " u' H2 P/ O; D B+ P , q8 K4 d: e1 n' a0 M int nEllipse = nUnits/3 // calculate how many to) I. J9 ]+ U7 {2 w/ j
draw % B6 n2 C4 V. ?9 w! h& l+ K int nIndex" }- y* P" A7 k% Z) C: i
// current ellipse that is being draw3 w! e6 R. H) K1 v1 a
& L3 j! ?! K0 A3 S& H H CBrush brush 2 l* ~7 z1 w3 E: ]5 D // bursh used for ellipse fill color# d, I& M+ d8 K" ^) Z: @
CBrush *pBrushOld // previous & Y* }9 u, F6 u O4 c brush that was selected into dc5 K) d' t+ X) ~+ j
//draw ellipse , gradually moving towards upper-right W, U+ G P) ?, K8 H* M+ O; }4 |# P corner ' F% S: z+ K8 |) C for (nIndex = 0 nIndes < + nEllipse nIndes++) % e4 F, i% D! ~$ k: ?0 x- _( u$ D { - r+ U" _, | p* l, g4 A+ X //creat solid brush7 R$ k: ^- P: H( i5 @6 Q( O
brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ). $ Q) o' F/ r3 p7 i! b' S+ Z ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) 9 q4 T3 a& }1 \+ h4 b* ^3 X /nEllipse ) ) ) 8 J: ~" t& S2 H3 ^: T) u c2 ~! J9 @8 Y0 d* _) x
//select brush into dc 2 G- ~% y* ]* z- n: o pBrushOld= dc .SelectObject (&brhsh) , I" t4 D: K# h% ^ & ^- Z: _' A# e" j5 M- a! F+ f //draw ellipse 4 h+ c3 b) p7 C R/ Z9 j2 R* G dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex , Q w# u) ?5 O3 Z
rect. right -( (int) fltStepHorz * nIndex )+ 1,1 p! i$ Y: t% P& y% z I0 S9 s4 c
rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) ; z7 y* k! d/ ?. ~6 O" v1 D8 k( s1 r, w
//delete the brush8 X; _6 r3 [8 X1 C4 j3 L% [' l
brush.DelecteObject ( ); X5 D0 F+ g/ U; z2 A9 `8 ~6 ~
} $ E/ `0 N# J. n6 m# ?( ]5 Z }: m: A5 @+ O+ y# K B3 B
, A. g+ q, l$ M) O- d5 g- W% i
最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。 # r) d( A" c6 d& g- P, m* N2 i' r
# B4 [" D' ?% o! y8 C5 ^
6 ^( P+ Y# H) W! P1 t' { r
& L3 j' S" \! C5 R2 ^. K/ Y UINT CRoundDlg : : OnNchitTest (Cpoint point ) % G2 ] f! r7 L) f$ z; Z {7 A3 b- y* q+ |' z) S
//Let user move window by clickign anywhere on thewindow . F# _% _5 G' }( x! W UINT nHitTest = CDialog : : OnNcHitTest (point)2 r) o% z/ h- a2 {5 b/ n
rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest 7 [; B1 L. O+ B% I! p" c# ]* C7 x; K2 q/ c
}% k) C8 f$ Z; d% o' [+ M
! p" M% J4 b( X+ ]) n4 r (25) 如何获取应用程序的 实例句柄? ; ]) K# P' K/ @% ?0 P+ f! t 应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄. / S: \, k3 B. x3 R3 H; ?; O* {4 b! w& |; k. Q
" R; I4 H: g0 S' m8 P9 d) G # b- ?( `! H9 {3 M$ b + b; ?( ?5 M! R, g l Example: HANDLE hInstance=AfxGetInstanceHandle()# W9 @- V; m( v) s9 F9 c
* ^) X6 b- d J6 |% t6 N/ z6 A(26) 如何编程结束应用程序? N. ~4 F# t6 D2 f' d1 t% b 这是个很简单又是编程中经常要遇到的问题. # q& f9 u7 n' V' N3 t; j 向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据.) E1 S- x1 a3 @- o5 E; f* P
5 M/ s" w1 [& y( S( K: I8 E2 A 7 f( f Z- M, ~! x: H* L% g 8 U8 W1 M/ H ^5 f //Get pointer to status bar . ! ~) b" V, x) G. c; P+ @4 n3 L; l CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( )" q- z* Y" H5 Q9 i7 l5 {1 ?; D6 n
—> GetDescendantWindow(AFX_IDW_STUTUS_BAR)8 a8 e7 l, t. ^, R# m, ~
" G4 T5 f( n V. m! o, R- `4 L' P% w (32) 如何使能和禁止工具条的工具提示6 ^) @8 Z2 G1 c/ }7 i+ M
如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数:7 l8 i) o& X1 z9 g# q6 O. U' x& p9 w
7 p, D+ z& g& l* x. T' w7 _
- O# |( ^( t4 `% I i
5 f! k5 d& d, d5 `$ X% u; `* n
/ B% S% o, _& _1 W% B6 H+ ~5 x# p% i" Z7 t
void CMainFrame : : EnableToolTips ( BOOL bDisplayTips ) / a( Y+ J z" [7 `# W2 p! h/ v {0 n& t1 y3 k5 Z, Z. N* h$ x
ASSERT_VALID (m_wndToolBar) y8 A V7 `$ e/ w( o
$ q( q E+ ]+ H) c DWORD dwStyle = m _wndToolBar.GetBarStyle ( ) 8 I8 y c2 |% H 0 {8 K. v$ v5 Z, T, @# } if (bDisplayTips) dwStyle |=CBRS_TOOLTIPS4 i q& T; G7 o# z$ F. A" w
1 X! N) W) {% U
else 7 G# K5 ~; Q0 O dwStyle & = ~CBRS_TOOLTIPS + x0 a U' S( E8 n( e & o s0 J( W. o m_wndToolBar.SetBarStyle (dwStyle ), I C* \9 {8 e) C/ h* }
} $ H1 q2 R7 ]. b& S) K; L. J; S: E) Z' M, Z
//Get pointer to toolbar . 4 A, ^% P' Z6 w2 K- Z; R/ \ CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( ) 3 |6 H& [, E/ @* _ —> GetDescendantWindow(AFX_IDW_TOOLBAR) _7 x; [! d+ ~# N' @% c9 O 5 d. C0 r% x' L (33) 如何设置工具条标题& k- O% X$ l2 w7 `7 o* r% O c
工具条是一个窗口,所以可以在调用CWnd : : SetWindowText来设置标题,例子如下:1 T$ j: t7 T0 g( @
6 e2 E+ `, u+ Z7 B U' Y# b0 J5 M; ?4 f, P
: Z+ B# u: J' ^5 m' r0 f
2 C6 H: `2 p H+ i0 U" L; Y int CMainFrame : : OnCreate (LPCREATESTRUCT lpCreateStruct ) 2 X, w/ G5 P8 b/ ]" o: z { * @9 M. z9 @7 y. W/ V/ q9 Z7 s … % C& J2 m* \6 q( k8 o& R* S // Set the caption of the toolbar ./ a1 V* x3 u) _5 N5 f1 D9 {
m_wndToolBar.SetWindowText (_T "Standdard") & U( |& h9 `% c* d: p! e: [% d. y 9 f; \! J. q) {5 ~(34) 如何使窗口始终在最前方? " ~8 Q6 o. M1 ?! U6 @1 q- a; D J: L- {4 }$ Q% M) C
2 \" E5 ~$ y5 q3 W* `( K1 C9 I, |4 h; L$ J* _6 j
0 C7 M+ ~ B) [- i BringWindowToTop(Handle) + T: T8 a, B. O/ E . _3 S, i8 E, M% l0 J " ~, i: h6 {6 B Z, I4 h7 b# d% c SetWindowPos函数,指定窗口的 最顶风格,用WS_EX_TOPMOST扩展窗口的风格1 F, ?1 H0 y7 n& e
+ ^& l, U& X9 E4 y n( Q7 g4 q- |6 B* L5 j# x2 m& Z9 t: T; {% I5 j8 i
0 ~, p6 \) W8 ?/ [) t
Example:2 t, Z' j! i5 `) O2 j+ }
void ToggleTopMost(7 H6 u. l7 j2 V8 x J& Y
CWnd *pWnd) 9 L3 A1 R$ C. D! U H { ; t6 x% p6 z" n' g ASSERT_VALID(pWnd) - S0 d! L$ C6 Q9 g; T A2 M S6 K. h( v$ w3 D; ^
pWnd ->SetWindowPos(pWnd-> GetStyle( ) &WS_EX_TOPMOST)? % l: x' r, _" T6 w- K, R + S) i. ^$ d, g) ~# p &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE)3 Q2 C/ z5 ~! G6 c. x- H
}7 i, ]# i: G( c
. J) m0 }! K* G3 x2 ?4 Y6 S2 ?
(35) 如何在对话框中显示一个位图 * k6 B$ }1 W8 ~; m& v6 l 这要归功于Win 32先进的静态控件和Microsoft的资源编辑器,在对话框中显示位图是很容易的, 只需将图形控件拖到对话中并选择适当属性即可,用户也可以显示图标、位图以及增强型元文件。+ A# ~9 }8 r. D" p; W- }. z
- f: m* V" B0 B+ Y+ w$ f
(36) 如何改变对话或窗体视窗的背景颜色 4 n/ i' I% `, c! Q 调用CWinApp : : SetDialogBkColor可以改变所有应用程序的背景颜色。第一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置为蓝色背景和黄色文本。) d* H% p- b2 v* S( L1 }
' |$ K0 A* c! B1 y5 c ' j) T+ {' p8 t* O3 I& V. \% ^, k2 B6 @4 \2 |/ P) f X. [ B
) I% ~- j1 m( s- l4 t$ f
BOOL CSampleApp : : InitInstance ( )# {2 }( ]5 O; Q- b g7 B4 \( r2 F
{% w% W" h) ~ g, u/ t
…& D# Y. I7 }8 j- T9 Q% b5 m
; f8 `7 {8 g p0 X0 p" n //use blue dialog with yellow text .3 i0 s# K5 v p2 \; M# y
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 ,255 , 0 ) )& |4 |! ^) o" d/ V
& K ]6 }1 b r4 o; |, A8 i4 m( C4 t
… 9 M/ o+ |; B) M: D# Q+ D }* k* h' ~8 T" z
+ B) }2 P& d7 K1 o1 C 需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说明了创建一个红色背景对话的步骤。 $ |5 A7 D* z3 Z# @; M' } ( e7 e7 ?5 G- G6 B 首先,给对话基类增加一人成员变量 1 }% Q, ^1 O$ {, J6 o4 f0 J' p; O0 m* ^
' J# I: h: H* @0 R" b
* L3 E" q( q( x- x- d3 k
4 G1 ~. y/ y5 V! L7 ~/ L( y3 F9 q
CBursh :class CMyFormView : public CFormView 7 u/ C* Q' k0 K- M+ s {8 }5 m& }' A' I/ N9 x
… % N9 L2 [7 X: [$ x6 S) s( M6 r/ m5 N0 n% f! w
private :5 W1 `' G: {2 t( U
CBrush m_ brush // background brush" {3 w. C" F s0 ~2 R# y: n
' E' x- W4 S/ f* U V) B: w
… ) R& X+ `- w$ v* E } 1 w1 v0 l5 A9 T, w# W! t9 \$ j( G. c3 t! Y3 [
其次, 在类的构造函数中将刷子初始化为所需要的背景颜色。 , s' K6 g9 p/ y1 ~; }/ M/ N2 q# e7 N- p