- H7 n. [" G( t& n4 S CWnd: :GetParentFrame 。 , _6 P# f. k. P. t# _) x- e void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point )/ K+ Q, g' B, G( Z+ j0 v
{ 8 X/ r- S$ _/ O Cdialog : : OnLButtonDow (nFlags, goint ). H: \) m" l3 o% _/ L" A$ ^! v! Y9 v
//Fool dialog into thinking simeone clicked on its4 a3 m6 ~) r: f0 I* }) I
caption bar . ' Y% h2 f8 t* ? PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x5 _! U# E6 ^: p1 N
, point. y $ s0 P7 _ @7 i, C* e2 f7 b# W1 O& ~ ) ) . J7 @! k: d- f6 k/ n# w" K } & k6 F& G" c4 Z5 @" p- c8 w3 N- g% O" ?/ \+ G0 R8 N5 _1 T" Q
(18) 如何改变视窗的背景颜色& M0 @ B. `+ R' n8 Q5 k
Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以防止Windows擦除窗口。9 K8 x1 ~& n+ z# H
$ O& B7 h S; M; \: |5 _
% V; N6 @5 b; Y. s0 c; K& @7 U, K7 b' g% C
; J# z- a. r) p2 W //Paint area that needs to be erased., [2 F+ s1 E, m1 k
BOOL CSampleView : : OnEraseBkgnd (CDC* pDC); z! d4 S. e8 a- C
{ 5 W3 r5 \0 R0 A2 t( V // Create a pruple brush. ; Y& {% ^3 p# D: C6 ^! t CBrush Brush (RGB (128 , 0 , 128) ) 9 U5 s$ Y- Q4 T) h$ { % Z2 |: h5 P( d" R- y" q5 s // Select the brush into the device context .& i0 S6 x/ M1 V/ w1 x
CBrush* pOldBrush = pDC—>SelcetObject (&brush)! N. ?; A: L$ j! J- J4 {
( E+ g( a* l+ b# O8 ?& [
// Get the area that needs to be erased . 6 d! L% i5 j/ x9 P, X& V# Q" F0 d2 d CRect reClip1 G/ L+ N8 A; ` M8 M% X. y
pDC—>GetCilpBox (&rcClip) _$ E9 q4 h" p/ A' y9 U: p% M //Paint the area.5 u$ {/ S' M0 E5 k* {! e
pDC—> PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY )9 U+ E% S) r, I# a5 _, k* N9 {
0 T# d0 N* G. J" ~6 g) p& r //Unselect brush out of device context . ' E9 H4 q [, d/ L. s% W: B pDC—>SelectObject (pOldBrush )( B p# R6 V% e9 x( R, K
2 H- v0 ]# ~! z4 q1 K; H8 f // Return nonzero to half fruther processing .5 e' K+ W- p+ t( P! L7 I2 F3 G
return TRUE' c5 T# J% G5 g9 c/ z
} & X" ^" c9 l3 b5 X! J% \3 H6 A 9 F) _% R$ N" e0 {19) 如何改变窗口标题5 T7 z9 _, C m! b7 R
调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。 * n2 O! A$ O3 y$ D5 @, d 7 w% n! z J5 ? 0 X/ |$ _" c/ ~5 }( g1 O& y- h3 n, d/ V/ J9 N" N# l: m0 ?
' ]& ]0 o! {9 T7 @7 l& e5 P //Set title for application's main frame window .2 y7 e2 X+ c9 u4 k5 R# H$ ]; z
AfxGetMainWnd ( ) —> SetWindowText (_T("Application title") )7 ~' M9 e. U. R7 _. j; s6 W: U
) H; g7 j6 p& {# J/ W9 s //Set title for View's MDI child frame window . - j7 p9 x3 A+ P( l GetParentFrame ( ) —> SetWindowText ("_T ("MDI Child Frame new title") + f! S C3 c1 n( H ) 4 K; G+ q. M. H( R @0 j( w % Y+ [& X ~' k5 \9 x //Set title for dialog's push button control.# f0 J2 a/ B# N
GetDigitem (IDC_BUTTON) —> SetWindowText (_T ("Button new title ") ) u) L v1 y, D8 F( @, `
1 L/ g5 ^& s9 F1 B6 z0 F
6 ]4 Y a. `/ m- ^+ g% C
如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用半文档化的函数AfxSetWindowText。该函数在AFXPRIV.H中说明,在WINUTIL.CPP中实现,在联机帮助中找不到它,它在AFXPRIV.H中半文档化, 在以后发行的MFC中将文档化。 * u2 r" c" F+ e( m6 K AfxSetWindowText的实现如下:; c- N2 E a9 @' F6 R# }
& k+ C, ^7 s; V, V+ K4 ^' b* I5 b9 J8 A' T- l, ]) M5 V, |
" p! o }- D) ^9 f
6 [$ i1 \6 @" t% B voik AFXAPI AfxSetWindowText (HWND hWndCtrl , LPCTSTR IpszNew ) 1 M: g7 k- k9 B$ k { ' v6 g1 v+ [1 J1 l; I itn nNewLen= Istrlen (Ipaznew). u; P5 R& i/ n9 Y
TCHAR szOld [256] 8 J3 e0 C2 V( b //fast check to see if text really changes (reduces % c9 F( w; d. M, r/ ? flash in the# r* I+ n: J7 f; f0 \- |7 R
controls ) ' _1 S$ A% S3 n1 S if (nNewLen >_contof (szOld) + \% u4 k. Z* m1 M+ f' r || : : GetWindowText (hWndCrtl, szOld , _countof (szOld) !=nNewLen8 b7 x* \! I5 C7 }( h1 D9 |
|| Istrcmp (szOld , IpszNew)! = 0 9 D0 H9 d0 L5 w3 m { 4 g' ?8 X! H3 H5 n; r //change it p2 r f* m7 J' o! I5 Y, N& V
: : SetWindowText(hWndCtrl , IpszNew ) 6 N7 b$ p8 G/ }2 R( y4 Z } ; O2 C7 _) Q* k5 |+ s } 3 t+ e4 K3 z* e 9 c: B0 ~6 H% l7 z* f1 B (20) 如何防止主框窗口在其说明中显示活动的文档名, s/ W; R' ^; g8 X! ?6 u$ @$ v
创建主框窗口和MDI子窗口进通常具有FWS_ADDTOTITLE风格位,如果不希望在说明中自动添加文档名, 必须禁止该风格位, 可以使用ClassWizard重置+ ~# f- b5 i! q
CWnd: : PreCreateWindow并关闭FWS_ADDTOTITLE风格。: c! I) F: L, i3 q8 _
0 @8 T# Q/ f2 r+ j
8 A# J$ j @8 E6 M1 f% o2 h: h/ m 5 I: Z7 D! Y, L) h" _ 6 p8 e( \6 f: h BOOL CMainFrame : : PreCreateWindow (CREATESTRUCT&cs) 0 c; c9 v) K7 e7 V1 I { 5 X( k5 B% ^: Z //Turn off FWS_ADDTOTITLE in main frame . V8 y4 z) g% K0 d: U( `: n+ a* o cs.styel & = ~FWS_ADDTOTITLE ) \$ j* C- M3 u) ~
return CMDIFrameWnd : : PreCreateWindow (cs ) / J+ K' j. O6 A2 a }( q6 E& a+ i9 }2 n# T
) Y5 D( M+ O% [8 r
) ^% Q# I; ]) o# V+ G# M' q# U 关闭MDI子窗口的FWS _ADDTOTITLE风格将创建一个具有空标题的窗口,可以调用CWnd: : SetWindowText来设置标题。记住自己设置标题时要遵循接口风格指南。' u1 e4 Z* y3 t
. c/ g/ Y2 P6 t p0 {; m
(21) 如何获取有关窗口正在处理的当前消息的信息 4 V" ]; {! i) _4 C" ~! W 调用CWnd: : GetCurrentMessage可以获取一个MSG指针。例如,可以使用ClassWizard将几个菜单项处理程序映射到一个函数中,然后调用GetCurrentMessage来确定所选中的菜单项。 $ q& ^9 C- S4 e1 y8 | 0 e" S+ X! `0 f3 O, g4 m, V+ d6 A3 Z0 h8 A" b
7 w) M; i& I" _% h
+ m& P' k# w- n& u0 K
viod CMainFrame : : OnCommmonMenuHandler ( ) 1 ?* C; ~0 e# _! G ^+ W { ( E+ ]: }' C( @* T. x7 d4 U //Display selected menu item in debug window . " T/ T( u4 e& M' F TRACE ("Menu item %u was selected . /n" ,& k5 v" L( e( c8 t; i$ I* Z- c8 h
1 D$ B) p4 ~1 m7 m$ W, J (22) 如何在代码中获取工具条和状态条的指针 . d& W& R/ n9 z! L9 Z% ~4 U, {2 z 缺省时, 工作框创建状态条和工具条时将它们作为主框窗口的子窗口,状态条有一个AFX_IDW_STATUS_BAR标识符,工具条有一个AFX_IDW_TOOLBAR标识符,下例说明了如何通过一起调用CWnd: : GetDescendantWindow和AfxGetMainWnd来获取这些子窗口的指针: ) q" e* [' I" K! a) D) U! ]0 k. t9 V" u( G) Z, \2 n$ P0 u4 V
0 C' ~1 Z* A: L) Q5 c/ n; N9 ?
" K$ S3 `. Z+ }3 Z& Q/ S# L
+ a+ c( J9 d+ E+ m2 a9 g! ` //Get pointer to status bar . 1 ], t( w. G. x0 ? CStatusBar * pStatusBar = (CStatusBar *) AfxGetMainWnd ( ) + ]/ g1 H0 Y3 \0 l9 w —> GetDescendantWindow(AFX_IDW_STUTUS_BAR) , i1 x5 \' c+ E) b+ S* L* p 7 c) ?5 z$ S0 h0 E, F! ]) A //Get pointer to toolbar .% \ `, v* X1 p3 H
CToolBar * pToolBar = (CToolBar * ) AfxGetMainWnd ( ) ' M7 A" a# ~- W7 Q+ r0 R% n —> GetDescendantWindow(AFX_IDW_TOOLBAR)4 C1 d8 W2 l1 }5 C0 X- f1 K1 M
$ Q4 N" U; p& O' t6 H; [ (23) 如何使能和禁止工具条的工具提示 ( ]- z$ C! R/ K) Q- v 如果设置了CBRS_TOOLTIPS风格位,工具条将显示工具提示,要使能或者禁止工具提示,需要设置或者清除该风格位。下例通过调用CControlBar : : GetBarStyle和CControlBar : : SetBarStyle建立一个完成此功能的成员函数:. T3 z0 V p- I S# {$ K7 U
1 c# I9 P Q' D4 c( _8 S5 V. X
/ M ~, f* W" h9 b3 x" r. O5 e; p
+ X! e1 O& Y. n5 T& F z0 c void CMainFrame : : EnableToolTips ( BOOL bDisplayTips )7 g, U; \9 I1 z+ x; D }
{8 N; R7 ]5 I" x" }0 O! ?7 X# k. F
ASSERT_VALID (m_wndToolBar) 0 x: y) r! K- d" _: {- C0 g4 b& t H8 b( Q$ H7 r7 e. }+ f( ^1 k DWORD dwStyle = m _wndToolBar.GetBarStyle ( )& {0 m3 W+ l* k. H; n+ u8 B
3 [9 N& v( v; f. w _, C if (bDisplayTips) dwStyle |=CBRS_TOOLTIPS 9 p, D5 i. k# k T& C 0 z" ]0 K* ?) p) a9 \- } else & d' t+ O- }% E3 l: _; I6 c% P dwStyle & = ~CBRS_TOOLTIPS 6 E: I2 \" }: T# }+ ~' ~5 ?8 W; X* L" ^/ L4 M
m_wndToolBar.SetBarStyle (dwStyle )3 E0 Z" {" @! v9 e* S
}* \6 O- C$ S3 y
$ N1 m# v1 P$ @(24) 如何创建一个不规则形状的窗口8 m7 H5 {+ q5 B# j
可以使用新的SDK函数SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。 使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。 , c, L% G a/ r 给对话类增加一个CRgn数据成员,以后要使用该数据成员建立窗口区域。 8 I% z" h" W* N/ N. Y7 [4 V' f- N9 O$ f' [4 A# r0 g- v
# j# z. a6 m- ]7 _4 Z* w% E; v) Q " z; _% H3 ]0 r% O% `" M, w4 l 9 U0 |0 p2 U/ x/ y( k r: k6 o! Y Class CRoundDlg : public CDialog ! W' o% ~' `) G, s. A. g" C {4 O* N0 [% i6 {9 o5 D3 G6 t& \
… d" j& b U# |1 g3 o
private : 6 H( J* u1 X& D% v# U6 t Crgn m_rgn : // window region 4 Q8 L7 Y1 T3 M C# G0 _ … ' c' s. j2 b i% e: B# `5 l } 0 i7 s9 Q M! l' T( \1 [5 p9 {* d6 A7 r 修改OnInitDialog函数建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口: - B& X" f1 H+ A! L, l BOOL CRoundDlg : : OnInitDialog ( ) b. [* d( T6 U! q6 o4 z2 J7 Y, C. {
{- F f$ k5 ~% t3 N; q
CDialog : : OnInitDialog ( ) 7 J2 d/ o: i5 A- R8 h8 | 4 y' k# j& c9 _ //Get size of dialog . " i- D, W' M u0 {; Z. B, L: ` CRect rcDialog1 j& m* X9 q% t/ s6 y
GetClientRect (rcDialog ): @9 i+ l* A' T5 `3 f/ a6 h" W% O
) p9 x6 `! W! K0 o* P
// Create region and assign to window .! Q* [( o1 v0 i# M# i7 o, O3 f+ t
m_rgn . CreateEllipticRgn (0 , 0 , rcDialog.Width( ) , rcDialog.Height ( ) ) 8 F9 f4 q* O4 G) a6 h, T SetWindowRgn (GetSafeHwnd ( ) , (HRGN) m_ rgn ,TRUE ) - z3 I, M, d5 x& |( s9 ^ ' `; [" f! W- F: |8 P( } return TRUE" s- w; |$ t5 l2 D. ?! @2 y
}2 c) q6 U, ]/ t
1 ~, V; z3 ^5 ]2 V
通过建立区域和调用SetWindowRgn,已经建立一个不规则形状的窗口,下面的例子程序是修改OnPaint函数使窗口形状看起来象一个球形体。) J5 L/ t& a2 @ ^
7 s- T' q$ r% B4 j, H# N/ N1 ?; u
; S" v# O4 S( D" J, w
9 U" W, [: |" v6 d- k6 p/ L
: _7 B3 \* ^1 m1 `
voik CRoundDlg : : OnPaint ( ) - Y0 a. R! Q7 S0 j) q8 [ {7 {, @; C1 F; c+ t7 [
CPaintDC de (this) // device context for painting7 y) U# y3 V- V7 h
. " h; E% c" G- `* R* T0 N1 U //draw ellipse with out any border , W- e; J0 p9 d: J; h; u8 @, P dc. SelecStockObject (NULL_PEN)0 w7 V2 O0 b' G* {5 {: h
//get the RGB colour components of the sphere color+ E& ?- |' I# }
COLORREF color= RGB( 0 , 0 , 255)! P' i" v. z# v* t; [2 C
BYTE byRed =GetRValue (color) S4 h' D$ x) H4 u+ [6 K
BYTE byGreen = GetGValue (color)+ K4 R' Y* V6 z# i+ q. u
BYTE byBlue = GetBValue (color)0 l; t! E# F) P; i# O; K9 j" Q
3 q+ [# \& b& a7 L" h
// get the size of the view window# t# ?7 h- b, U A. t4 u
Crect rect 5 {8 q2 q x: l5 ?9 e GetClientRect (rect)8 f2 |9 {* n2 B2 l; f I
, `9 r6 L- a% l* T- b: |" |
// get minimun number of units; c6 u7 ^2 D7 y/ A8 T: Z @
int nUnits =min (rect.right , rect.bottom )9 Q( Z W$ S6 ` T
! I+ h! `8 t1 K% k //calculate he horiaontal and vertical step size+ n! l& R8 i8 a, l G2 v
float fltStepHorz = (float) rect.right /nUnits; X$ Q8 A$ p" B2 B& M N
float fltStepVert = (float) rect.bottom /nUnits ( U A- L: D; m, L0 C | j( R 2 V% P$ E! ?9 a 7 [. i& c3 ], b h5 e int nEllipse = nUnits/3 // calculate how many to 2 R7 f5 D; i7 S$ N draw . F) Q' O/ r) Y9 p1 `$ a int nIndex5 {1 @4 B, k. H4 s
// current ellipse that is being draw* b% C' N+ K% \
' R( X4 {& c/ V4 U% {5 Q$ [
CBrush brush0 M3 T9 c% Q; ^# C4 L
// bursh used for ellipse fill color2 o5 m2 S" `! P8 t! X* j5 b( f8 v g
CBrush *pBrushOld // previous8 Q7 u4 ]: E8 q o& P
brush that was selected into dc4 j5 M) F4 H! Z
//draw ellipse , gradually moving towards upper-right % P9 a# Y& t. G, a corner # H, y' Z3 F, C# J for (nIndex = 0 nIndes < + nEllipse nIndes++)- [8 _; ~* f3 y- _; O" n; U
{4 G* L& P1 l& V/ h! a) L
//creat solid brush ( q9 ~. `% @" z brush . CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse ). + r9 F+ J4 C( w3 \( p" m: F% ]- e ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex * byBlue) 1 C6 d Y% V8 @. U+ | Z1 y. e9 C# B( u /nEllipse ) ) ) , M) B$ a2 K$ f a* D/ m0 g: w1 D5 T- j R! C: s
//select brush into dc $ F' `& p# d+ \5 `1 z7 f pBrushOld= dc .SelectObject (&brhsh) 7 D' y. }2 C0 e( J$ e, ?* d0 L, z9 k7 C% ^
//draw ellipse O4 d" s7 F4 Z2 X& W4 J dc .Ellipse ( (int) fltStepHorz * 2, (int) fltStepVert * nIndex ,* f! u( ?7 k9 Z1 F3 e8 e ]& d& j+ S
rect. right -( (int) fltStepHorz * nIndex )+ 1, 1 B- R/ F {8 ] V( H3 Q rect . bottom -( (int) fltStepVert * (nIndex *2) ) +1) / g7 ^" m& ^6 ^9 k 7 ^1 g% p( P, C* {# |5 y //delete the brush- N# h# a X/ N9 q
brush.DelecteObject ( )) S+ D7 j' k9 h6 A" [" r/ j7 F5 ]) ]
} 7 D2 ?7 t$ l$ A; q! M. D } * S" P- D4 y9 n/ f + H! ]: ]% {( [- b/ ^' Y* w) o! `: N 最后,处理WM_NCHITTEST消息,使当击打窗口的任何位置时能移动窗口。 & j1 f) i l ?9 S1 U, z. U) Z Z" c Q5 B7 R l. W5 }; J" D- v" g# O
+ V0 R& t) `& ^" _ K
5 L0 K2 T! |) }# l* r3 E
UINT CRoundDlg : : OnNchitTest (Cpoint point ) ; w9 o. [. Q8 ^! N( |. H {8 } K5 I: @8 {; s% P7 f
//Let user move window by clickign anywhere on thewindow .# [1 y+ q8 l; T/ ?
UINT nHitTest = CDialog : : OnNcHitTest (point) 1 t+ \8 V$ `' w3 L* n rerurn (nHitTest = = HTCLIENT)? HTCAPTION: nHitTest 7 r, _* }9 x0 z- B 4 C' F( j2 C, X( A3 m } + r& R8 l+ y, S' e8 M2 W; ^* {) [
(25) 如何获取应用程序的 实例句柄? 3 Y8 m, e- x3 _. C( G$ i 应用程序的实例句柄保存在CWinApp m_hInstance 中,可以这么调用AfxGetInstancdHandle获得句柄. ' Y% L9 w, Y7 o: a / R9 d& t T1 I. X# e2 ?: C( J 8 H1 }" T* B4 F( p9 k. h4 h0 |. c+ B& C+ ~% Z) [; A8 A7 S
% G6 Z# n t1 P9 B' T
Example: HANDLE hInstance=AfxGetInstanceHandle()! |, R2 A% a( b2 X
8 H( M5 r$ v% R/ T1 \- d) w6 ~
(26) 如何编程结束应用程序? 9 i3 n. R0 L$ I9 `' l+ d 这是个很简单又是编程中经常要遇到的问题. , J8 o$ w6 ], s5 A C! T4 B 向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示是否保存修改过的数据. / q2 J# S5 F2 v8 ]3 W( h 0 b; Y- I) B* {1 @) s$ w[被屏蔽广告]- a6 Q' C# o- y4 P. D) y3 x" H8 v
7 F: c' r) V6 A
系列文章:VC实用小知识总结(一) 7 X* k) ~0 Q1 V; h' S' U l: ~* D ) R4 {& W c/ q8 {1 u6 m6 O1 a. x2 e
( l `/ Z2 [! p' J! S (39) 如何改变控件的字体$ z- ?8 o9 w: D& ]& n. W
由于控件是也是窗口,用户可以调用CWnd: : SetFont指定新字体。该函数用一个Cfont指针,要保证在控件撤消之前不能撤消字体对象。下例将下压按钮的字体改为8点Arial字体:( E/ X' l; P s+ {1 p$ O A
/ [' v5 W6 J6 I* T+ V# C# U* f
; E# M" l; L/ s 2 k! Z* O \7 ]. R1 a3 V) W a( E1 X9 T
//Declare font object in class declaration (.H file ).( ^1 A0 Y6 B: s& k S
private : Cfont m_font ) t9 r1 U+ Q& a7 y4 k% o7 g // Set font in class implementation (.Cpp file ). Note m_wndButton is a7 |, v8 m- C0 Z+ \& l
//member variable added by ClassWizard.DDX routines hook the member' p8 G- e- r. g; |0 L" `' P( Q
//variable to a dialog button contrlo. - Z8 p% U+ R1 | _" o BOOL CSampleDialog : : OnInitDialog ( ) 1 S U& V: K# C {1 R6 C7 f/ Q6 a9 Z+ S5 O: L' j
…" { `) o8 b2 n( a5 F/ V
//Create an 8-point Arial font1 ~4 `( p& M/ p$ V" ]! a& s
m_font . CreateFont (MulDiv (8 , -pDC0 y, L+ ~% W+ @3 s) U a
—> GetDeviceCaps(LOGPIXELSY) ,72). 0 , 0 , 0 , FW_NORMAL , 0 , 0,0, ANSI_CHARSER, OUT_STROKE_PRECIS , 2 a& N: M3 G5 S) F. C% }8 G; l: C; z3 ~& g5 d& e
CLIP_STROKE _PRECIS , DRAFT _QUALITY5 k3 x( G) w# h: I6 c( m8 `
VARIABLE_PITCH |FF_SWISS, _T("Arial") ) ; J9 S0 O. J$ Q/ e3 ^5 p8 _/ {8 U: h# f/ }
//Set font for push button . : f& m' w' }# Z8 J+ }: o M m_wndButton . SetFont (&m _font ) + {/ Y. u2 U6 L5 ~/ J; ]* Y6 \! N) P; L
…, |8 z' X3 Z8 V- _# [6 p, d6 w
} ( p: h! e$ x6 t$ y: g$ g& F$ f" b4 q) V F% J( I( U
(40) 如何在OLE控件中使用OLE_COLOR数据类型3 e% W0 l" A/ n' m: l
诸如COleControl : : GetFortColor和COleControl : : GetBackColor等函数返回OLE _COLOR数据类型的颜色,而GDI对象诸如笔和刷子使用的是COLORREF数据类型,调用COleControl : : TranslateColor可以很容易地将OLE_COLOR类型改为COLORREF类型。下例创建了一个当前背景颜色的刷子: * ? I' M$ i& X + v: f# V$ n; _3 M ) G, H3 ~& \8 Q3 l( q6 Q' q$ }0 |& r0 Q3 z, G7 t0 s5 F
, g$ l9 b# T$ l' W* x3 ?* G& [ void CSampleControl : : OnDraw (CDC* pdc4 w# Y2 F( A/ L
const Crect& rcBounds , const Crect& rcInvalid9 ?' N- [2 @$ {) x* m( [8 x
) ( `) {- I* K. G' ^ {. b; E4 h) S7 _1 Q5 `4 E d- F
//Create a brush of the cuttent background color. j. z5 J( S; X. l! F CBrush brushBack (TranslateColor (GetBackColor () ) ) 3 O% r% L+ v* @# l4 f1 x8 N2 ^ 4 ]& `3 Q& B* b w/ d //Paint the background using the current backgroundcolor .. p1 w& @5 M1 [
pdc—> FilllRect (rcBounds , &brushBack)) N. q% ^1 a' o) U- L5 E# X: Z
( S7 C# ]- L7 w) M$ p( t3 \7 }9 Q //other drawign commands & v% T3 o9 X ~* h1 Q6 g 1 i/ w7 l7 Q- T/ m1 o( s0 Q … 9 W S& U& W* m7 { }1 Y5 n [$ S. p t; d
3 c, Y3 w! `" \! S) P% E- [6 U
7 C) N% s$ h* z4 W* d* N
6 }4 [0 v1 y1 z! p2 d" O9 k
9 ~% W# C1 u. }1 V. n