怎样解决弹出菜单弹不出来的问题?

Jeffery0211 2004-12-24 04:11:11
当使用弹出菜单模式显示一窗体后,在这个窗体中再使用弹出菜单就弹不出来,请问在不改变这个前提下(模式显示窗体)有什么办法可以解决这个问题?谢谢!
...全文
191 点赞 收藏 26
写回复
26 条回复
Jeffery0211 2004年12月28日
谢拉!不知道你使用API的思路是怎样?
回复 点赞
fanzai 2004年12月28日
补充一点,用Timer1弹出form1的时候,form0还是被暂停了的。只是这个时候暂停不会有什么不良影响。
:)
回复 点赞
fanzai 2004年12月28日
嗯?呵呵,我还没说清楚?

用timer应该只是方法之一。
当点击菜单项之后,如果马上弹出form1会造成form0运行暂停,导致菜单不能关闭。而现在把弹出方式改成激活Timer1,而不是马上弹出form1,这样form0就不会被暂停了。
Timer1的响应时间设置成了1(1毫秒),这样Timer1会马上作出反应。但是由于VB的具体运行机制,在VB中某一个操作没有完成之前,一般不会响应更多的其他事件。所以,只有当菜单关闭之后,VB程序空闲了,Timer1才会响应,从而打开form1。
Timer1的代码部分也很简单,就是弹出窗口,然后将自己禁用(避免无限制的弹出)。

另外,使用API的方法应该也很可取。我还没有具体尝试。如果需要我可以试验一下。
回复 点赞
b_nautilus 2004年12月28日
我以为,可能windows系统不允许同时弹出两个菜单,而原先的代码因为在showf2_Click()事件中执行show 1 之后系统无法关闭menu_main,所以form2中无法弹出菜单.用timer控件起到给系统关闭menu_main时间的做用吧.{ 个人猜想,还请fanzai(帆仔)赐教 : ) }
回复 点赞
Jeffery0211 2004年12月28日
还想请教一下:Timer控件在这里起到什么作用呢?这个内部机制是怎样的呢?谢谢!
回复 点赞
fanzai 2004年12月28日
一下是copy来的例子,使用API可以在菜单关闭后得到用户选择的选项,从而避免多次打开菜单的问题。

'Example submitted by Leondias Frost (a993435@yahoo.com)
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&
Const TPM_RETURNCMD = &H100&
Const TPM_RIGHTBUTTON = &H2&
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function CreatePopupMenu Lib "user32" () As Long
Private Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal HWnd As Long, ByVal lptpm As Any) 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 Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Dim hMenu As Long
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim Pt As POINTAPI
Dim ret As Long
hMenu = CreatePopupMenu()
AppendMenu hMenu, MF_STRING, 1, "Hello !"
AppendMenu hMenu, MF_GRAYED Or MF_DISABLED, 2, "Testing ..."
AppendMenu hMenu, MF_SEPARATOR, 3, ByVal 0&
AppendMenu hMenu, MF_CHECKED, 4, "TrackPopupMenu"
GetCursorPos Pt
ret = TrackPopupMenuEx(hMenu, TPM_LEFTALIGN Or TPM_RETURNCMD Or TPM_RIGHTBUTTON, Pt.x, Pt.y, Me.HWnd, ByVal 0&)
DestroyMenu hMenu
Debug.Print ret
End Sub
回复 点赞
Jeffery0211 2004年12月27日
对,就想”maskdata(凋零|好孩子不抢分“说的那样
回复 点赞
33184777 2004年12月27日
menu123是肯定可以显示不出来,
回复 点赞
Jeffery0211 2004年12月27日
我说的是这样的:在一窗体(Form0)中使用弹出菜单(使用方法:PopupMenu PMenu)中某一菜单项调用Form1(这里是使用模式显示Form1),再在Form1中的某一事件中使用另一弹出菜单调用其他的Form,此时弹出菜单显示不出来。 我知道如果不是模式显示Form1就没有问题,windows不允许同时弹出两个菜单(既在一个弹出菜单还没有消亡再弹出另外的菜单是不行的,我就想请教有什么办法可以解决这个问题呢(不改变窗体的模式显示)? 谢谢!
回复 点赞
maskdata 2004年12月27日
***********Form1*****************
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu menu_main
End If
End Sub

Private Sub showf2_Click()
Form2.Show 1
End Sub


***********Form2*****************
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu menu123
End If
End Sub

他说的是这种情况,menu123显示不出来
回复 点赞
fanzai 2004年12月27日
看了三遍,终于看明白了。呵呵。确实说起来有点绕嘴。

但是我没发现类似情况啊!我尝试了你说的情况,没发现问题。
你是用什么方式弹出菜单的?PopupMenu吗?
是什么事件引起探出窗口的呢?Command1_Click之类的吗?

还请多贴一些细节:)
回复 点赞
Jeffery0211 2004年12月27日
大家都误解了我的意思了,我说的是使用弹出菜单调用(模式显示)form1,然后在form1上再使用弹出菜单,这样使用就使用不了弹出菜单了! 谢谢!
回复 点赞
b_nautilus 2004年12月27日
似乎timer就是一个延时的作用吧,好神奇
回复 点赞
wfhlxl 2004年12月27日
in form2
Public form1mode As Integer

Private Sub menu_Click()
form1mode = 1
Form1.Show

End Sub
in form1
Private Sub Form_Load()
Form1.Show form1mode
End Sub
回复 点赞
fanzai 2004年12月27日
我这次应该没误解了吧?:)
回复 点赞
fanzai 2004年12月27日
正像你说的。form0弹出模式窗口form1后,form0停止运行,菜单不能把上关闭。这样form1里面就不能再打开同一个菜单。

用timer应该只是方法之一,就是当点击菜单项之后,Timer1被激活,而不是马上弹出form1。当菜单关闭之后,Timer1才会响应,从而打开form1。
回复 点赞
Jeffery0211 2004年12月27日
请先看清楚前提条件!谢谢!
回复 点赞
Jeffery0211 2004年12月27日
能不能详细介绍一下,没有看明白,timer起什么作用呢?谢谢!
回复 点赞
fanzai 2004年12月27日
没讲清楚~~~~

sdas就是一个菜单项,弹出form1的选项。

form1里面基本不用动,应该可以了。
回复 点赞
fanzai 2004年12月27日
加一个Timer1,设置:Interval = 1,Enabled = False。

form0的代码如下:

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu menu_main
End If
End Sub

Private Sub sdas_Click()
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Form1.Show 1
Timer1.Enabled = False
End Sub
回复 点赞
发动态
发帖子
VB基础类
创建于2007-09-28

2751

社区成员

19.7w+

社区内容

VB 基础类
社区公告
暂无公告