|
原帖由 小fisher 于 2009-5-23 23:19 发表
试验了一下,如果不加最大、最小化按钮,只需在窗口的Initialize事件中一次性将关闭按钮禁用即可,如果添加了最大、最小化按钮,窗口在弹出菜单之前会收到WM_INITMENU消息,在这个消息处理程中会重绘菜单,之后关闭 ...
小fisher,太感谢您了,我就说嘛,没有您的指导,我哪能学API哟。
我对API基本上是“盲”,知道的一点儿全是从您那儿学过来的。您上面的代码,我差点没读懂,后来通过搜索,结合这个帖子的注释:
http://club.excelhome.net/thread-306231-1-1.html我总算明白了大部分,下面是我的理解,您看对不对,如有错误,请赐教哟:
1、什么叫子类化?
子类化只是把截取窗口类的过程地址,用自己的窗口过程替代他。(这个我之前在学编程的时候知道一丁点儿,所以不太陌生!)
2、您给的代码是怎样“子类化”的?
第一步:设置新的窗口消息处理函数
Private Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
Select Case Msg
Case WM_INITMENUPOPUP
WndProc = 0
Case Else
WndProc = CallWindowProc(lOldProc, hwnd, Msg, wParam, lparam)
End Select
End Function
此函数中有两点意思:
(1)当消息为WM_INITMENUPOPUP时,强制返回值为0,按您的意思,表示“不处理”此消息。对吗?
(2)当消息为别的消息时,由原来的窗口函数(系统默认的)去处理它。对吗?
第二步:设置新的窗口函数替代系统默认的处理函数
lOldProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
lOldProc 即为系统的默认的窗口(消息)处理函数地址。
有一点儿不明白:
CallWindowProc(lOldProc, hwnd, Msg, wParam, lparam)我大概知道是向窗口发送消息,并传递消息处理函数的地址让它去处理这个消息。我不明白的是:它的返回值是什么?联系上面您讲的,返回0是表示不处理,其它正常返回的值是什么?不同的值表示什么涵义?(不同的值表示不同的处理方法?值与方法对应是什么?不过,这也许是系统内部的事,不该由系统外的人(或函数)来管,是吧?)
总之,谢谢小fisher的精心指导!感激之至,无以言表!
[ 本帖最后由 fdd 于 2009-5-24 07:04 编辑 ] |
|