WINDOWS运行的基础是“消息机制”,所谓的“消息”是一个唯一的值,这个值会被一个窗体或操作系统收到,它能告诉什么事件发生了以及需要采用什么样的动作来响应。这与我们人类的神经系统将感知的信息传递给大脑,而大脑发出指令给我们的身体非常相似。于是每一个窗体都具有一个消息句柄,这个机制使得所有发自于WINDOWS操作系统的消息能被接收到需要强调的是每个窗体以及每个控件,包括按钮、文本框、
图片框等都具有这样的消息句柄。WINDOWS操作系统会跟踪这些消息句柄,这称为类结构中的一个WindowProc,所谓的类结构是于窗体句柄相关联的。
当我们加入一个新的WindowProc函数而这个WindowProc与原始的窗体函数相符合的话,我们称这个窗被子类化了。换言之,如果WINDOWS操作系统发给你所在的WindowProc一个消息,而你所在的WindowProc正在响应其它的动作,这时你必须将剩余的消息传递给一个默认的WindoProc。
如下所示: 操作系统消息-->你所在WindoProc-->默认的WindoProc而一个窗体是可以被子类化多次的,这样就产生了如下的情况:
Windows Message Sender --> Your WindowProc --> Another WindowProc _--> Yet Another WindowProc --> Default WindowProc
What is subclassing anyway?
通过窗体子类化,你可以改变响应消息的顺序,也就是说,你可以把消息传递到默认的WindowProc上而不立即响应。举个例子:
如果我们要在接收到WM_PAINT 消息后,在窗体上画出一些东西,可以用下面的语句实现:
Public Function WindowProc(Byval hWnd, Byval etc.)
Select Case iMsg ''筛选出WM_PAINT消息 Case SOME_MESSAGE ''如果是其他消息 DoSomeStuff
Case WM_PAINT ''如果是WM_PAINT 消息 ''首先把消息传递给一个默认的WindowProc WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
DoDrawingStuff ''进行画图操作
Exit Function ''因为我们已经把消息传递给默认的WindowProc,我们可以退出这个WindowProc '' End Select '' End Function |