API创建弹出菜单及事件响应问题?????

mybelta2 2009-02-27 10:46:22
以下是用API在Treeview1控件中创建的弹出菜单,以下只是实现了菜单弹出,但是没有响应事件,假设单击弹出菜单中的Form1,则调用窗体Form1,响应事件代码该怎么写呀?急死我了,谢谢高人指教!!!!!


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 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
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Dim hMenu As Long
Private Type POINTAPI
X As Long
Y As Long
End Type

Private Sub Form_Load()
hMenu = CreatePopupMenu()
AppendMenu hMenu, &H0&, ByVal 0&, "Form1"
AppendMenu hMenu, &H0&, ByVal 0&, "Form2"
End Sub

Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Pt As POINTAPI
GetCursorPos Pt
If Button = 2 Then
TrackPopupMenu hMenu, TPM_LEFTALIGN, Pt.X, Pt.Y, 0, Me.hwnd, ByVal 0&
GetMenu Me.hwnd
End If
End Sub
...全文
303 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
mybelta2 2009-03-05
  • 打赏
  • 举报
回复
谢谢老马!!
我先把帖子结了,如果我还有什么疑问再请教你哈!!!
嗷嗷叫的老马 2009-03-05
  • 打赏
  • 举报
回复
汗......那我就写两句吧!

http://www.m5home.com/temp/弹出菜单测试.rar

困.....睡觉去.
mybelta2 2009-03-04
  • 打赏
  • 举报
回复
????????????????????????
ftz820127 2009-03-04
  • 打赏
  • 举报
回复
把菜单放在不显示的普通窗体上就行了
mybelta2 2009-03-04
  • 打赏
  • 举报
回复
??????????
我用的是MDI窗体和子窗体呀,关键是子窗体加载时,子窗体的菜单会覆盖主窗体的菜单啊
嗷嗷叫的老马 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zzyong00 的回复:]
既然用VB,用这种方式弹出菜单,无语....
[/Quote]
是啊,同感...........自带的直接事件返回,这么方便干嘛不用....
bob008 2009-03-04
  • 打赏
  • 举报
回复
干脆去找汇编的代码啊,汇编的菜单都是自己定义ID的。。。 吃饱了撑的。。。
mybelta2 2009-03-04
  • 打赏
  • 举报
回复
帖子加分咯,加为140分,只要我调试来可以,立马结贴!!!!!!!!!!!!!
mybelta2 2009-03-04
  • 打赏
  • 举报
回复
有没有高人能帮忙改完整????????

注意是MDI子窗体!!!!!!!!!!!!
mybelta2 2009-03-03
  • 打赏
  • 举报
回复
why ??
zzyong00 2009-03-03
  • 打赏
  • 举报
回复
既然用VB,用这种方式弹出菜单,无语....
fjwyshan 2009-03-03
  • 打赏
  • 举报
回复
不懂,帮顶
Tiger_Zhao 2009-03-03
  • 打赏
  • 举报
回复
英文不会查字典吗?
有 TPM_RETURNCMD 就返回菜单 ID,无 TPM_RETURNCMD 就返回 0/非0。
ftz820127 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zzyong00 的回复:]
既然用VB,用这种方式弹出菜单,无语....
[/Quote]
同意,VB提供了很方便的弹出式菜单的调用,只要在FORM1里预调好要弹出的菜单用内容

在想弹出菜单的地方,调用一个PopupMenu <菜单项,如form1.nmuTest>
就能弹出你想要的菜单
事件响应就写在FORM1里和普通窗口菜单一样
mybelta2 2009-03-02
  • 打赏
  • 举报
回复
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 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
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Dim hMenu As Long
Private Type POINTAPI
X As Long
Y As Long
End Type


Private Sub Form_Load()
hMenu = CreatePopupMenu()
AppendMenu hMenu, &H0&, 0, "Form1"
AppendMenu hMenu, &H0&, 5, "Form2"
End Sub

Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Pt As POINTAPI, lRet As Long

GetCursorPos Pt
If Button = 2 Then
lRet = TrackPopupMenu(hMenu, 0, Pt.X, Pt.Y, 0, Me.hwnd, ByVal 0&) '只能响应左键
'Debug.Print lRet
End If

select case lret
case 0
form1.show
case 5
form2.show
end select

End Sub

以上是完整的代码,注意:以上Form,Form1,Form2都是MDI子窗体。希望能再给指点修改,谢谢!!!!!
mybelta2 2009-03-02
  • 打赏
  • 举报
回复


哎,我还是转不过这个弯...
Tiger_Zhao 2009-03-02
  • 打赏
  • 举报
回复
TPM_RETURNCMD 决定如何返回
[Quote=MSDN:]
Return Values
If you specify TPM_RETURNCMD in the uFlags parameter, the return value is the menu-item identifier of the item that the user selected. If the user cancels the menu without making a selection, or if an error occurs, then the return value is zero.

If you do not specify TPM_RETURNCMD in the uFlags parameter, the return value is nonzero if the function succeeds and zero if it fails. To get extended error information, callGetLastError.[/Quote]
mybelta2 2009-03-02
  • 打赏
  • 举报
回复
谢谢VB老鸟!我上边的那句有什么不对的吗?
lRet = TrackPopupMenu(hMenu, 0, Pt.X, Pt.Y, 0, Me.hwnd, ByVal 0&)
我就是把TPM_RETURNCMD的值设位0,表示只能响应左键,有什么地方不对吗?能指点详细点吗?
Tiger_Zhao 2009-03-02
  • 打赏
  • 举报
回复
lRet = TrackPopupMenu(hMenu, TPM_RETURNCMD, Pt.X, Pt.Y, 0, Me.hwnd, ByVal 0&)
mybelta2 2009-02-28
  • 打赏
  • 举报
回复
昨晚我试了一下,还是一点问题,有几点我还是不太清楚 :

1.
lRet = TrackPopupMenu(hMenu, 2, Pt.X, Pt.Y, 0, Me.hWnd, ByVal 0&) 左右键都可以单击,对吗?

2.
菜单单击响应事件代码写在什么地方?就写在Form_MouseUp()过程中吗?(我估计不行吧)
select case lret
case 0
form1.show
case 5
form2.show
end select

这样写行吗????????

3.
若Form ,Form1 ,Form2 都是单文档才行,即使是这样,在弹出菜单后,即使你没选择任何菜单,它都要打开FORM1,说明菜单还没有销毁;如果FORM 是MDI子窗体就根本打不开任何窗体,怎么回事呢?希望高人继续指点指点!!!!!
加载更多回复(11)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧