|
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讯息的优先等级比较低,所以,如果您还在使用滑鼠或者游标键移动卷动列的话,这个讯息将不会立即被处理。如果您想 |