如题:想做一个菜单,伴随着鼠标移动而移动,菜单命令可发送消息  不知道有没有这类源码,或者思路,请教高手

解决方案 »

  1.   

    就是右键弹出的菜单吧。做一个菜单后,起名aaa,在form的mousedown中  aaa.popupmenu就可以了。
      

  2.   

    '************************* Form1 的代码
    Option Explicit
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    '**************************************** 自制菜单用到的API
    Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
    Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
    Private Declare Function CreatePopupMenu Lib "user32" () As Long
    Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, ByVal nReserved As Long, ByVal Hwnd As Long, ByVal lprc As Any) As Long
    '*****************************************************
    Const MF_CHECKED = &H8&
    Const MF_APPEND = &H100&
    Const TPM_LEFTALIGN = &H0&
    Const MF_DISABLED = &H2&
    Const MF_GRAYED = &H1&
    Const MF_SEPARATOR = &H800&
    Const MF_STRING = &H0&
    Private Type POINTAPI
       X As Long
       Y As Long
    End Type
    Dim mSubMenu&
    Private Sub Form_Load()
       mSubMenu = CreatePopupMenu()
       AppendMenu mSubMenu, MF_STRING, 100, "菜单 1"
       AppendMenu mSubMenu, MF_SEPARATOR, ByVal 0&, ByVal 0&
       AppendMenu mSubMenu, MF_STRING, 101, "菜单 2"
       AppendMenu mSubMenu, MF_SEPARATOR, ByVal 0&, ByVal 0&
       AppendMenu mSubMenu, MF_STRING, 102, "退 出"
       OldProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf WndProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       DestroyMenu mSubMenu
       SetWindowLong Me.Hwnd, GWL_WNDPROC, OldProc
    End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       Dim Pt As POINTAPI
       GetCursorPos Pt
       If Button = 2 Then TrackPopupMenu mSubMenu, TPM_LEFTALIGN, Pt.X, Pt.Y, 0, Me.Hwnd, ByVal 0&
    End Sub
    '*********************************Module1.bas 的代码
    Option Explicit
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Const BN_CLICKED = 0
    Public Const WM_COMMAND = &H111
    Public Const GWL_WNDPROC = (-4)
    Public OldProc&
    Public Function WndProc(ByVal Hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
       If Msg = WM_COMMAND Then
          If (wParam And &HFFFF0000) = BN_CLICKED Then
             Select Case wParam And &HFFFF
                Case 100
                   MsgBox "您选择了菜单1"
                Case 101
                   MsgBox "您选择了菜单2"
                Case 102
                   Unload Form1
             End Select
          End If
       Else
          WndProc = CallWindowProc(OldProc, Hwnd, Msg, wParam, lParam)
       End If
    End Function
      

  3.   

    哈哈楼上同志见笑了, 你细看,如果把 "自制菜单" 部份拿掉的话, 倒也是省了几行, 代码已短到不能再短了, 拿掉的话楼主自己在窗体上做菜单那也不是很累吗 ?伴随着鼠标移动而移动 这是楼主的要求,  因此鼠标位置的判断代码少不了.菜单命令可发送消息 楼主的第二要求, 我不敢再写了,因为再用到Sendmessage加上一些宣告,再多一些代码,楼主不疯掉啊,哈哈....楼上的换你来个简单点的吧, 我实在无能为力啦.....
      

  4.   

    一句话,把鼠标HOOK掉,什么都好解决!