子视窗控制项(三十七)

2010-12-30 21:12:42 · 作者: · 浏览: 33090
crollProc必须被定义为callback函式。

对三个卷动列中的每一个,COLORS1使用SetWindowLong来设定新的卷动列视窗讯息处理程式的位址,并取得现存卷动列视窗讯息处理程式的位址:

OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC,
(LONG) ScrollProc)) ;

现在,函式ScrollProc得到了Windows发送到COLORS1中三个卷动列(当然不是其他程式中的卷动列)的卷动列视窗讯息处理程式的全部讯息。ScrollProc视窗讯息处理程式在接收到Tab或者Shift-Tab键时,就将输入焦点改变到下一个(或者上一个)卷动列。它使用CallWindowProc呼叫旧的卷动列视窗讯息处理程式。

给背景著色
 

当COLORS1定义它的视窗类别时,也为其显示区域背景定义了一个实心的黑色画刷:

wndclass.hbrBackground = CreateSolidBrush (0) ;

当您改变COLORS1的卷动列设定时,程式必须建立一个新的画刷,并将该新画刷代号放入视窗类别结构中。如同使用GetWindowLong和SetWindowLong能得到并设定卷动列视窗讯息处理程式一样,用GetClassWord和SetClassWord能得到这个画刷的代号。

您可以建立新的画刷并将其代号插入视窗类别结构中,然後删除旧的画刷:

DeleteObject ((HBRUSH)
SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
CreateSolidBrush (RGB (color[0], color[1], color[2])))) ;

Windows下一次重新为视窗的背景著色时,将使用这个新画刷。为了强迫Windows抹掉背景,我们将使整个显示区域无效:

InvalidateRect (hwnd, &rcColor, TRUE) ;

TRUE(非零)值作为第三个参数,表示希望在重新著色之前删去背景。

InvalidateRect使Windows在视窗讯息处理程式的讯息伫列中放进一个WM_PAINT讯息。由於WM_PAINT讯息的优先等级比较低,所以,如果您还在使用滑鼠或者游标键移动卷动列的话,这个讯息将不会立即被处理。如果您想