CHEARV 发表于 2010-10-14 21:01:05

事件模式下,_GUICtrlMenu_AddMenuItem怎么用?[已解决]

本帖最后由 CHEARV 于 2010-10-19 19:09 编辑

我在网上找了好多的关于菜单的例子,找到一段这样的代码:
      $hMenu = _GUICtrlMenu_CreatePopup()
      _GUICtrlMenu_AddMenuItem($hMenu, "菜单1")
      _GUICtrlMenu_AddMenuItem($hMenu, "菜单2")
      _GUICtrlMenu_AddMenuItem($hMenu, "菜单3")
      _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI)
      _GUICtrlMenu_DestroyMenu($hMenu)
原作者的例子是基于消息模式写的,我想用于事件模式,不知道要怎么写。
我在菜单1语句后面加了这么一句代码:GUICtrlSetOnEvent(-1, "MYfunc1") 无效。请高手帮我改一下:#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$hGUI = GUICreate("Form2", 413, 298, 302, 218)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUIClose")
$Button1 = GUICtrlCreateButton("Button1", 168, 96, 105, 41)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(100)
WEnd

Func Button1Click()
       $hMenu = _GUICtrlMenu_CreatePopup()
      _GUICtrlMenu_AddMenuItem($hMenu, "菜单1")
                GUICtrlSetOnEvent(-1, "Myfunc1")
      _GUICtrlMenu_AddMenuItem($hMenu, "菜单2")
      _GUICtrlMenu_AddMenuItem($hMenu, "菜单3")
      _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI)
      _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc

Func GUIClose()
        Exit
EndFunc

Func MyFunc1()
        MsgBox(0,"Hello","你点了菜单1")
EndFunc

afan 发表于 2010-10-14 21:28:52

这个最好用右键菜单,不要浪费了按钮控件的基本功能

3mile 发表于 2010-10-14 23:52:22

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)

$hGUI = GUICreate("Form2", 414, 299, 246, 157)
$MenuItem1 = GUICtrlCreateMenu("文件")
$MenuItem2 = GUICtrlCreateMenuItem("打开", $MenuItem1)
GUICtrlSetOnEvent(-1, "MenuItem2Click")
$MenuItem3 = GUICtrlCreateMenuItem("历史", $MenuItem1)
$MenuItem4 = GUICtrlCreateMenuItem("退出", $MenuItem1)
GUICtrlSetOnEvent(-1, "MenuItem4Click")
$MenuItem5 = GUICtrlCreateMenu("关于")

GUISetOnEvent($GUI_EVENT_CLOSE, "hGUIClose")
GUISetState(@SW_SHOW)

While 1
    Sleep(100)
WEnd

Func hGUIClose()
    Exit
EndFunc

Func MenuItem2Click()
    $file=FileOpenDialog("", @ScriptDir & "\", "AU3文件 (*.au3)", 1 + 4 )
    If Not @error Then MsgBox(0,0,$file)
EndFunc

Func MenuItem4Click()
    Exit
EndFunc

CHEARV 发表于 2010-10-15 17:22:12

谢谢楼上朋友,可能我没表达清楚,我不想单独出现菜单栏,仅想点一个控件就谈出上下文菜单,而且是点左键弹出而非右键。 只有我上面找到的那个函数可以实现,但我却不知道怎么调用。

6678720 发表于 2010-10-16 09:21:20

谢谢各位分享,学习了。。。

C.L 发表于 2010-10-16 13:09:02

回复 4# CHEARV

好象 _GUICtrlMenu_AddMenuItem()并没有返回的控件

可以用注册消息的方式,下面是更改后的代码,可以在左键点击按钮后显示菜单,点出菜单运行相应的函数:


#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$hGUI = GUICreate("Form2", 413, 298, 302, 218)
GUISetOnEvent($GUI_EVENT_CLOSE, "GUIClose")
$Button1 = GUICtrlCreateButton("Button1", 168, 96, 105, 41)
GUICtrlSetOnEvent(-1, "Button1Click")

Global Enum $id1 = 1000, $id2, $id3

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        Sleep(100)
WEnd

Func Button1Click()
        GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
        $hMenu = _GUICtrlMenu_CreatePopup()
        _GUICtrlMenu_AddMenuItem($hMenu, "菜单1", $id1)
        _GUICtrlMenu_AddMenuItem($hMenu, "菜单2", $id2)
        _GUICtrlMenu_AddMenuItem($hMenu, "菜单3", $id3)
        _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI)
        _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc   ;==>Button1Click

Func GUIClose()
        Exit
EndFunc   ;==>GUIClose

Func MyFunc1($i)
        MsgBox(0, "Hello", "你点了菜单" & $i)
EndFunc   ;==>MyFunc1

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Switch $iwParam
                Case $id1
                        MyFunc1(1)
                Case $id2
                        MyFunc1(2)
                Case $id3
                        MyFunc1(3)
        EndSwitch
EndFunc   ;==>WM_COMMAND

CHEARV 发表于 2010-10-16 23:17:18

太棒了,谢谢。 另外,我还有两个小疑问:
Global Enum $id1 = 1000, $id2, $id3
这句代码是不是表示我创建控件数量应该控制在1000以内。如果我创建的控制数量超过1000,但$id1依然赋值为1000会出现什么情况?

第二,GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
这句代码是不是放在主程序里面会好些,因为不需要每次都注册吧。

macran 发表于 2015-3-22 00:17:53

enum $id1=1000 表示后面的变量已经赋值为 1001 1002...以此类推 多看看windows 编程 Autoit 就很简单了 如果你连枚举都不知道 就要像学C语言一样 从头一字不漏看下 教程

gwgelin 发表于 2015-4-13 09:48:22

很不错的问题刚好解决我的烦恼
页: [1]
查看完整版本: 事件模式下,_GUICtrlMenu_AddMenuItem怎么用?[已解决]