|
在颜色改变之後使该视窗立即变成最新的(目前的),那么您可以在InvalidateRect之後增加下面的叙述:
UpdateWindow (hwnd) ;
但这会使得键盘和滑鼠处理变慢。
COLORS1中的WndProc函式不处理WM_PAINT讯息,而是将其传给DefWindowProc。Windows对WM_PAINT讯息的内定处理只是呼叫BeginPaint和EndPaint使视窗生效。因为在InvalidateRect呼叫中已经指定背景要被抹掉,所以BeginPaint呼叫使Windows发出一个WM_ERASEBKGND(删除背景)讯息,WndProc也将忽略这个讯息。Windows用视窗类别中指定的画刷将显示区域的背景抹去,这样就处理了这个讯息。
在终止以前进行清除总是一个好主意,因此在处理WM_DESTROY讯息处理期间,再一次呼叫DeleteObject:
DeleteObject ((HBRUSH) SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) GetStockObject (WHITE_BRUSH))) ;
给卷动列和静态文字著色
在COLORS1中,三个卷动列的内部和六个文字栏位中的文字著色为红、绿和蓝色。卷动列的著色是通过处理WM_CTLCOLORSCROLLBAR讯息来完成的。
在WndProc中,我们为画刷定义了一个由三个代号组成的静态阵列:
static HBRUSH hBrush [3] ;
在处理WM_CREATE期间,我们建立三个画刷:
for (I = 0 ; I < 3 ; I++) hBrush[0] = CreateSolidBrush (crPrim [I]) ;
其中crPrim阵列中包含三种原色的RGB值。在WM_CTLCOLORSCROLLBAR处理期间视窗讯息处理程式传回这三画刷中的一个:
case WM_CTLCOLORSCROLLBAR: i = GetWindowLong ((HWND) lParam, GWL_ID) ; return (LRESULT) hBrush [i] ;
在处理WM_DESTROY讯息的过程中,这些画刷必须被删除:
for (i = 0 ; i < 3 ; i++) DeleteObject (hBrush [i])) ;
同样地,静态文字栏位中的文字是在处理WM_CTLCOLORST |