找回密码
 加入
搜索
查看: 7200|回复: 8

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

  [复制链接]
发表于 2010-10-14 21:01:05 | 显示全部楼层 |阅读模式
本帖最后由 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
发表于 2010-10-14 21:28:52 | 显示全部楼层
这个最好用右键菜单,不要浪费了按钮控件的基本功能
发表于 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
 楼主| 发表于 2010-10-15 17:22:12 | 显示全部楼层
谢谢楼上朋友,可能我没表达清楚,我不想单独出现菜单栏,仅想点一个控件就谈出上下文菜单,而且是点左键弹出而非右键。 只有我上面找到的那个函数可以实现,但我却不知道怎么调用。
发表于 2010-10-16 09:21:20 | 显示全部楼层
谢谢各位分享,学习了。。。
发表于 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

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

第二,  GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
这句代码是不是放在主程序里面会好些,因为不需要每次都注册吧。
发表于 2015-3-22 00:17:53 | 显示全部楼层
enum $id1=1000 表示后面的变量已经赋值为 1001 1002...以此类推 多看看windows 编程 Autoit 就很简单了 如果你连枚举都不知道 就要像学C语言一样 从头一字不漏看下 教程
发表于 2015-4-13 09:48:22 | 显示全部楼层
很不错的问题刚好解决我的烦恼
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-13 03:30 , Processed in 0.081778 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表