四、Windows子窗口控件的滚动条类别—窗口子类别化(Window Subc
滚动条控件的窗口消息处理程序是Windows内部的。但是,将GWL_WNDPROC标识符作为参数来呼叫GetWindowLong,您就可以得到这个窗口消息处理程序的地址。另外,您可以呼叫SetWindowLong给该滚动条设定一个新的窗口消息处理程序,这个技术叫做「窗口子类别化」,非常有用。它能让您给现存的窗口消息处理程序设定「挂勾」,以便在自己的程序中处理一些消息,同时将其它所有消息传递给旧的窗口消息处理程序。
在COLORS1中对卷动消息进行初步处理的窗口消息处理程序叫做ScrollProc,它在COLORS1.C文件的尾部。由于ScrollProc是COLORS1中的函数,而Windows将呼叫COLORS1,所以ScrollProc必须被定义为callback函数。
对三个滚动条中的每一个,COLORS1使用SetWindowLong来设定新的滚动条窗口消息处理程序的地址,并取得现存滚动条窗口消息处理程序的地址:
OldScroll[i] = (WNDPROC) SetWindowLong (hwndScroll[i], GWL_WNDPROC, (LONG) ScrollProc)) ;
现在,函数ScrollProc得到了Windows发送到COLORS1中三个滚动条(当然不是其它程序中的滚动条)的滚动条窗口消息处理程序的全部消息。ScrollProc窗口消息处理程序在接收到Tab或者Shift-Tab键时,就将输入焦点改变到下一个(或者上一个)滚动条。它使用CallWindowProc呼叫旧的滚动条窗口消息处理程序。