当前位置:编程学习 > VB >>

新手-托盘程序的问题

这是一段托盘程序
其中有个地方没看懂就是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 ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,