VB程序有多个form同时打开,并且没有titleBar
要求-类似MSN messenger:1、程序运行后自动隐藏,
在任务栏右下角的托盘显示图标,鼠标左键或右键点击图标,可以操作显示和隐藏选项;2、根据form1的某个变量修改程序状态,即修改托盘中的图标,像MSN messenger的联机和脱机显示图标切换。

解决方案 »

  1.   

    MDI窗体,两个菜单MyTrayMnu,mnuA'这段代码不是用的消息处理,而是捕获鼠标的移动事件,因此有可能导致菜单位置不准确.
    Option Explicit
    Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long
    Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As LongPrivate Const MAX_TOOLTIP As Integer = 64
    Private Const NIF_ICON = &H2
    Private Const NIF_MESSAGE = &H1
    Private Const NIF_TIP = &H4
    Private Const NIM_ADD = &H0
    Private Const NIM_DELETE = &H2
    Private Const WM_MOUSEMOVE = &H200
    Private Const WM_LBUTTONUP = &H202
    Private Const WM_RBUTTONUP = &H205Private Type NOTIFYICONDATA
        cbSize           As Long
        hwnd             As Long
        uID              As Long
        uFlags           As Long
        uCallbackMessage As Long
        hIcon            As Long
        szTip            As String * MAX_TOOLTIP
    End TypePrivate Const MF_bitmap = &H4&
    Private nfIconData As NOTIFYICONDATAPrivate Sub Sys_Tray()
            Dim Mnu_Hwnd As Long
            Dim Mnu_Id As Long
            Dim i As Long        nfIconData.hwnd = Me.hwnd
            nfIconData.uID = Me.Icon
            nfIconData.uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
            nfIconData.uCallbackMessage = WM_MOUSEMOVE
            nfIconData.hIcon = Me.Icon.Handle
            nfIconData.szTip = "Ac's Test Form" & vbNullChar
            nfIconData.cbSize = Len(nfIconData)
            Call Shell_NotifyIcon(NIM_ADD, nfIconData)
    End SubPrivate Sub MDIForm_Load()
            Sys_Tray
            With Me
                .Visible = False
            End With
    End SubPrivate Sub MDIForm_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
            Dim lMsg As Single
            lMsg = X / Screen.TwipsPerPixelX
            If lMsg = WM_RBUTTONUP Then
              MyTrayMnu.Visible = True
              Me.PopupMenu MyTrayMnu
            End If
    End SubPrivate Sub MDIForm_Unload(Cancel As Integer)
            Call Shell_NotifyIcon(NIM_DELETE, nfIconData)
    End SubPrivate Sub mnuA_Click()
            With Me
                .Visible = Not .Visible
            End With
    End Sub
      

  2.   

    发贴人说明:有十几个form页面同时显示,并非MDI窗体。
      

  3.   

    MDI窗体不能存放多个form吗....?
      

  4.   

    http://www.j2soft.cn/static_html/200511092136103255admin.html
    这里有源码,你可以看看
      

  5.   

    发贴人说明: 是在现成的程序上修改,没使用MDI form,同时打开的form各占一部分页面,一共有十几个,而且随着用户的操作可能变换使用不同的form。
    尝试过一般的托盘隐藏程序,只能隐藏某一个form,而不能同时隐藏/显示所有的form。向高手求解!
      

  6.   

    如果有一个一定开启或隐藏的窗体的话,可以在其余窗体放置一个timer,检查这个窗体隐藏/显示的状态,就简单实现了.