改 frm2.show 1
为 frm2.show
为 frm2.show
解决方案 »
- 一个小软,为何本机用不了?
- 打包之后﹐裝在別人的機子上﹐他的輸入法不能在我的系統里輸﹐是亂碼﹖﹖﹖
- 请问vb 打印中的 :: 是啥意思?
- 请问:好象有一种文件,类似于文本文件,但是可以很方便地读取其指定的一行,请问高手是什么文件?
- 开发基于Web的<<通用数据录入及查询部件>>的讨论
- IIS和FTP服务器配置。
- 超级难题-----如何让IE上网的时候伪装IP地址
- 好人请进,因为坏人会看不起我的...
- 送分+傻傻的一问,装了MSDN的请来看看,非常感谢。(要不我就要重装MSDN了!)
- 为何用 “ON ERROR GOTO "不能catch Error
- 高手注意:如何抓全图??????(分不够再加500分求贤)
- 100分求解!!这几句E文是什么意思????
如果放在mnuADD_click(一个弹出来的菜单的执行过程)就不能用frm2.show 1
用frm2.show是正常的
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
PopupMenu mnuOP2
End Sub
来代替frm2_mouseUP就都能显示出来了
你的那个“1”是要干什么,没看明白
你的那个“1”是要干什么,没看明白
而不是frm2.show,
“1”表示vbmodal啊。
我还从来没遇到这么奇怪的问题。
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
vb的menu和具体的窗体是关连的,当目前正在编辑的窗体是form1的时候,你添加的菜单是属于form1的,那么当然,你在form2的事件中直接写popupmenu mnuAdd是不对的,不信的话,当你正在编辑form2的时候,看看菜单编辑器中--
解决办法是:你在form2中重新建立一个菜单.
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
会被屏蔽掉。在一个菜单中以有模式方式弹出一个窗体时,菜单不会被
关闭,只当窗体被关闭时才返回去执行菜单控制中后面的代码,然后关
闭菜单。所以在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
好像依稀是这样子解决这个问题的,具体细节不是很记得了,
希望对你有所帮助。