新手-托盘程序的问题
这是一段托盘程序其中有个地方没看懂就是addtoTray过程中NewWindowProc与OldWindowProc中怎么传递消息的,为什么要这么传递
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
'*******************************************************************
' 目的: 自定义的消息处理过程
' 输入: hWnd:接受消息的窗口句柄
' Msg:消息内容
' wParam:消息参数
' lParam:消息参数
' 返回: 消息处理结果
'*******************************************************************
Public Function NewWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = TRAY_CALLBACK Then
' The user clicked on the tray icon.
' Look for click events.
If lParam = WM_LBUTTONUP Then
' On left click, show the form.
If TheForm.WindowState = vbMinimized Then
TheForm.WindowState = TheForm.LastState
End If
TheForm.SetFocus
Exit Function
End If
If lParam = WM_RBUTTONUP Then
' On right click, show the menu.
TheForm.PopupMenu TheMenu
Exit Function
End If
End If
' 发送其他消息给原有的消息处理过程
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
End Function
'*******************************************************************
' 目的: 为任务栏添加一个新的图标
' 输入: frm:接受任务栏消息的窗体
' mnu:右键单击任务栏图标时显示的菜单
' 返回: 无
'*******************************************************************
Public Sub AddToTray(frm As Form, mnu As Menu)
' frm窗体的ShowInTaskbar属性必须在设计期间设置为False,
' 这个属性在程序运行期间是只读的
Set TheForm = frm
Set TheMenu = mnu
' 为窗体设置新的消息处理函数
OldWindowProc = SetWindowLong(frm.hWnd, GWL_WNDPROC, AddressOf NewWindowProc)
' 设置任务栏图标的参数
With TheData
.uID = 0
.hWnd = frm.hWnd
.cbSize = Len(TheData)
.hIcon = frm.Icon.Handle
.uFlags = NIF_ICON
.uCallbackMessage = TRAY_CALLBACK
.uFlags = .uFlags Or NIF_MESSAGE
.cbSize = Len(TheData)
End With
'添加任务栏图标
Shell_NotifyIcon NIM_ADD, TheData
End Sub
--------------------编程问答-------------------- NewWindowProc和OldWindowProc没有消息传递,在Windows中,每个窗口都有一个消息处理过程,向用VC++编写窗口程序时需要自己处理这个过程,而VB将这个消息处理过程对开发人员屏蔽了。但是有时候需要处理窗口消息,例如这里需要处理WM_LBUTTONUP以及WM_RBUTTONUP消息,因此需要通过SetWindowLong将自己编写的过程(在这里是NewWindowProc方法)设置为窗口消息处理过程,SetWindowLong会将原来的窗口消息处理过程的指针返回。在代码中需要将这个指针保存(在这里保存到了OldWindowProc中),在退出的时候通过SetWindowLong将恢复原来的消息处理过程。 --------------------编程问答-------------------- 这是Subclass技术。
NewWindowProc:拦截某个(些)特定消息,然后用你的消息去代替
OldWindowProc:就是不用自己去处理,让系统自己处理。 --------------------编程问答-------------------- 继续上面,在你设置了NewWindowProc作为窗口消息处理过程以后,对于任何消息,Windows都会发送到NewWindowProc方法中,但是在你的代码中只处理了WM_LBUTTONUP以及WM_RBUTTONUP消息,因此在你的NewWindowProc方法中调用了:
NewWindowProc = CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam)
这个方法将其它没有处理的消息传递给原来的消息处理过程来处理。
--------------------编程问答-------------------- Subclass中文叫子类化技术,怪怪的,直接翻译的。
google 或 百度 “VB子类化” --------------------编程问答-------------------- 谢谢各位 已经明白了 --------------------编程问答-------------------- 关注
补充:VB , 基础类