四、Windows子窗口控件的滚动条类别—给滚动条和静态文字着色
在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_CTLCOLORSTATIC消息中呼叫SetTextColor来着色的。文字背景用SetBkColor函数设定为系统颜色COLOR_BTNHIGHLIGHT,这导致文字背景颜色和滚动条与文字后面的静态矩形控件的颜色一样。对于静态文字控件,这种文字背景颜色只用于字符串中每个字符后面的矩形,而不会用于整个控件窗口。为了实作这一点,窗口消息处理程序还必须传回COLOR_BTNHIGHLIGHT颜色画刷的句柄。这个画刷被称为hBrushStatic,它在WM_CREATE消息处理期间建立,在WM_DESTROY消息处理期间清除。
在WM_CREATE消息处理期间依据COLOR_BTNHIGHLIGHT颜色建立画刷,并且在执行期间使用这一画刷时,我们遇到了一个小问题。如果程序在执行期间改变了COLOR_BTNHIGHLIGHT颜色,那么静态矩形的颜色将发生变化,并且文字背景的颜色也会变化,但是文字窗口控件的整个背景将保持原有的COLOR_BTNHIGHLIGHT颜色。
为了解决这个问题,COLORS1也简单地通过使用新颜色重新建立hBrushStatic来处理WM_SYSCOLORCHANGE消息。