负责开发一个工程的一个小模块
其中用到右键菜单,在本机上运行完全正常,加入到整个工程的时候,右键菜单就出不来了,只能在左上角点出主菜单。
试着在调用右键菜单的地方加了一个MsgBox没有任何问题MsgBox可以弹出
说明不是右键问题
但是单独执行程序(不作为一部分加载进总工程时)右键菜单就一切正常。
请各位指教,有人说要用子类处理。
可是我是菜鸟新学,用的时候老是出错,编译总也解决不了。
请各位高手指点。

解决方案 »

  1.   

    如果整个工程中有mdi窗体时,而你的窗体又是子窗体,那么子窗体的菜单无效的,即弹不出来的.只能把菜单写在mdi中,才可以调用的。
      

  2.   

    谢谢abc10,可是我编的最后是一个.dll工程,好像不能加载mdi。
    有没有其他什么方法呀?
      

  3.   

    在MDI中好象只能Windows API建立菜单,但是建立好菜单之后要想知道什么时候用户选择了菜单就有点困难了。这里我们使用(http://www.china-askpro.com/download/mbocx32b.zip)Message Blaster控件(类似的控件还有MsgHook等)来获得菜单选中的WM_COMMAND消息。VB 5.0以上的版本可以不使用控件而直接使用Subclass技术获得该消息,但这种方法稳定性差,这里就不介绍了。 
        首先建立一个窗体,加上菜单和Message Blaster控件。然后输入以下代码: 
        Option Explicit 
        Const WM_COMMAND = &H111 
        Const MF_BYPOSITION = &H400& 
        Const MF_STRING = &H0& 
        Const MF_POPUP = &H10& 
         
        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 InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long 
        Private Declare Function CreatePopupMenu Lib "user32" () As Long 
        Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long 
         
        Dim hPopMenu As Integer, hFileMenu As Integer 
         
        Private Sub Form_Load() 
         Msgblst321.hWndTarget = hwnd 
         Msgblst321.MsgList(0) = WM_COMMAND 
         hFileMenu = GetSubMenu(GetMenu(hwnd), 0) 
         hPopMenu = CreatePopupMenu() 
         InsertMenu hPopMenu, -1, MF_BYPOSITION + MF_STRING, 500, "File" 
         InsertMenu hFileMenu, -1, MF_BYPOSITION + MF_STRING + MF_POPUP, hPopMenu, "Hello" 
        End Sub 
        运行这个例子,你的第一个菜单中将增加一个“Hello”项,而它带有“File”的子菜单。 
        Private Sub Form_Unload(Cancel As Integer) 
         DestroyMenu hPopMenu 
        End Sub 
         
        Private Sub Msgblst321_Message(ByVal MsgVal As Long, ByVal wParam As Long, ByVal lParam As Long, lplRetVal As Long) 
         If wParam = 500 Then 
         MsgBox "You choose a popup menu!" 
         End If 
        End Sub 
      

  4.   

    谢谢rainstormmaster,可是Message Blaster是什么控件呀?
    我用MSDN也查不到
      

  5.   

    用于hook的控件,地址我上面写了:)
    http://www.china-askpro.com/download/mbocx32b.zip