改 frm2.show 1
为 frm2.show 

解决方案 »

  1.   

    这可能是VB的Bug我以前也遇到过,根本解决不了,所以你也不要浪费时间了,用别的办法把!
      

  2.   

    确实很怪!把  frm2.show 1 放在别的过程中就不会这样了。
    如果放在mnuADD_click(一个弹出来的菜单的执行过程)就不能用frm2.show 1 
    用frm2.show是正常的
      

  3.   


    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       PopupMenu mnuOP2
    End Sub
    来代替frm2_mouseUP就都能显示出来了
      

  4.   

    frm2.show 1要换成frm2.show才可以
    你的那个“1”是要干什么,没看明白
      

  5.   

    frm2.show 1要换成frm2.show才可以
    你的那个“1”是要干什么,没看明白
      

  6.   

    Form_MouseDown同样没用,放在任何地方都没用,只要用的是frm2.show 1
    而不是frm2.show,
    “1”表示vbmodal啊。
    我还从来没遇到这么奇怪的问题。
      

  7.   

    在Form2中用API来显示菜单就可以了。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, lprc As RECT) As Long
    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 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
    Private Type POINTAPI
            x As Long
            y As Long
    End Type
    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End TypePrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim rc As RECT
        Dim pt As POINTAPI
        pt.x = x / Screen.TwipsPerPixelX
        pt.y = y / Screen.TwipsPerPixelX
        ClientToScreen Me.hwnd, pt
        TrackPopupMenu GetSubMenu(GetMenu(Me.hwnd), 0), 0, pt.x, pt.y, 0, Me.hwnd, rc
    End Sub
      

  8.   

    我的程序在Win2k+vb6中测试通过的,你的程序是怎么写的,可以贴出来吗?现有有点事情,迟点再回复你!
      

  9.   

    给我100分,因为咱们同路,我也曾遇到过这个问题,不过解决了:
    vb的menu和具体的窗体是关连的,当目前正在编辑的窗体是form1的时候,你添加的菜单是属于form1的,那么当然,你在form2的事件中直接写popupmenu mnuAdd是不对的,不信的话,当你正在编辑form2的时候,看看菜单编辑器中--
    解决办法是:你在form2中重新建立一个菜单.
      

  10.   

    补充一下,show 1 之后是不行的,必须是show 0
      

  11.   

    form2.PopupMenu mnuOP2 试试
      

  12.   

    在Frm2中粘贴以下程序,终于解决了!!!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, lprc As RECT) As Long
    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 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
    Private Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Private Declare Function CreatePopupMenu Lib "user32" () As Long
    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 LongPrivate Const MF_BYPOSITION = &H400&
    Private Const MF_POPUP = &H10&
    Private Type POINTAPI
            X As Long
            Y As Long
    End Type
    Private Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End TypePrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim rc As RECT
        Dim pt As POINTAPI
        Dim hPopupMenu As Long
        Dim hTempMenu As Long
        
        '创建临时菜单
        hTempMenu = CreatePopupMenu()
        
        'Menu.Visible=True时GetMenuItemID()才能取得正确的ID
        mnuOP2.Visible = True
        hPopupMenu = GetSubMenu(GetMenu(Me.hwnd), 0)
        
        '依次添加到临时菜单中
        AppendMenu hTempMenu, 0, GetMenuItemID(hPopupMenu, 0), mnuNew.Caption
        AppendMenu hTempMenu, 0, GetMenuItemID(hPopupMenu, 1), mnuDelete.Caption
        mnuOP2.Visible = False
        
        '显示菜单
        pt.X = X / Screen.TwipsPerPixelX
        pt.Y = Y / Screen.TwipsPerPixelX
        ClientToScreen Me.hwnd, pt
        TrackPopupMenu hTempMenu, 0, pt.X, pt.Y, 0, Me.hwnd, rc
        
        '删除菜单
        DestroyMenu hTempMenu
    End SubPrivate Sub mnuNew_Click()
        MsgBox mnuNew.Caption
    End SubPrivate Sub mnuDelete_Click()
        MsgBox mnuDelete.Caption
    End Sub
      

  13.   

    呵呵,两年前碰到的一个问题,当时是狠看了一把MSDN才明白其中的道理。VB在整个程序运行当中只允许弹出一个菜单,任何弹出的第二个菜单都
    会被屏蔽掉。在一个菜单中以有模式方式弹出一个窗体时,菜单不会被
    关闭,只当窗体被关闭时才返回去执行菜单控制中后面的代码,然后关
    闭菜单。所以在show出第二个有模式窗体的时候其实已经存在了一个未
    关闭的菜单,所以第二个窗体上是无法再弹出菜单的。
    可能我的表达能力不是很强,说的不是很有逻辑,你试试下面两段代码
    就知道我说什么了。
    1.
       private sub mnuADD_click
          frm2.show 1
          msgbox "test"
       end sub
    2.
       private sub mnuADD_click
          frm2.show 0
          msgbox "test"
       end sub
      解决这个问题的一个办法就是以无模式方式show出第二个form。
    如果一定要以有模式弹出第二个窗体(就像当年我碰到的问题一样),
    我当时是用了个蠢办法去避开这个问题,就是使用timer控件,先初始化timer控件: timer1.enable = false
    时间间隔看着设好了,我当初是选的10毫秒
    在timer时间触发事件里加上如下控制 
         timer1.enable = false
         frm2.show 1
    在菜单里面加上如下控制: 
       private sub mnuADD_click
         timer1.enable = true
       end sub
    好像依稀是这样子解决这个问题的,具体细节不是很记得了,
    希望对你有所帮助。