找回密码
 加入
搜索
查看: 3990|回复: 1

[GUI管理] 【已解决】在标签卡上右键弹出菜单如何响应

[复制链接]
发表于 2015-1-2 12:15:37 | 显示全部楼层 |阅读模式
本帖最后由 vigiles 于 2015-1-3 11:13 编辑

需求:
      1.在窗体中创建一个标签卡,右键点击标签卡时切换标签,并弹出菜单,点击菜单项做出响应。
      2.右键监听须要在 GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") 中实现。

思路:
      在 _WM_NOTIFY 监听到标签卡上的右击时,发送鼠标单击实现切换,然后创建弹出式(上下文)菜单,
      然后根据点击的菜单项响应。

问题:
      1. _GUICtrlTab_Create 用户自定义函数创建的标签卡只能使用 _GUICtrlMenu_CreatePopup 创建其菜单,此时不知如何响应菜单项。通过 GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") 未能实现。
      2. GUICtrlCreateTab 原生函数创建的标签卡,_GUICtrlMenu_CreatePopup 创建的菜单可以出现,但不知如何响应,鼠标单击亦不执行;GUICtrlCreateContextMenu创建菜单呢,能出现菜单时鼠标单击不执行,鼠标执行时菜单不出现!

代码:
#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <TabConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>

Opt("GUIOnEventMode", 1)

Global Enum $menuId_Close = 2000, $menuId_Save, $menuId_Save_As, $menuId_Print
Local $hMenu

$guiWelcome = GUICreate("中徽教育", 600, 300)
        GUISetOnEvent($GUI_EVENT_CLOSE, "Func_GUI_EVENT_CLOSE")
        
        ; 1.创建标签卡
        ;$tabWelcome = _GUICtrlTab_Create( $guiWelcome, 1, 27, 598, 230)
        $tabWelcome = GUICtrlCreateTab(1, 27, 598, 230)        ; 使用此种原生创建,主要就是为了响应右键菜单,做出菜单交互
                $item0InTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 0, "标签页0")
                $item1InTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 1, "标签页1")

GUISetState(@SW_SHOW, $guiWelcome)

; 2.监听右键
GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")  ; 响应 _GUICtrlTab_Create 标签卡失败


;-------------------------------- 分割线 -----------------------------
While 1
        Sleep(200)
WEnd

Func Func_GUI_EVENT_CLOSE ()
        Exit
EndFunc

Func _WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
    Local $tNMHDR, $hwndFrom, $code, $i_idOld, $i_idNew
    Local $tNMTBHOTITEM
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $code = DllStructGetData($tNMHDR, "Code")

        ; 使用 GUICtrlCreateTab 原生创建的标签卡必须这样才能从 $hwndFrom 中得到
        If Not (hwnd($tabWelcome)) Then
                $tabWelcome= ControlGetHandle($guiWelcome, "", $tabWelcome)
        EndIf
        
    Switch $hwndFrom
                ; 标签卡
        Case $tabWelcome
            Switch $code
                                
                                ; 3.点击右键时创建菜单
                                Case $NM_RCLICK
                                        ConsoleWrite("dddddddddd" & @CRLF)
                                        
                                        ; _GUICtrlTab_Create创建标签卡:
                                        ;      使用 GUICtrlCreateContextMenu 时执行
                                        ;      使用 _GUICtrlMenu_CreatePopup 时不执行
                                        ; GUICtrlCreateTab原生建标签卡:
                                        ;      GUICtrlCreateContextMenu中使用 _WinAPI_GetDlgCtrlID 不执行;不使用 _WinAPI_GetDlgCtrlID 执行。
                                        ;      使用_GUICtrlMenu_CreatePopup时不执行
                                        MouseClick("left")
                                        
                                        ; _GUICtrlTab_Create创建标签卡:使用或不使用 _WinAPI_GetDlgCtrlID 都不出现
                                        ; GUICtrlCreateTab原生建标签卡:使用 _WinAPI_GetDlgCtrlID 出现;不使用 _WinAPI_GetDlgCtrlID 不出现
                                        $menu = GUICtrlCreateContextMenu(_WinAPI_GetDlgCtrlID($tabWelcome))
                                                $menuItem1 = GUICtrlCreateMenuItem("菜单项1", $menu)
                                                        GUICtrlSetOnEvent($menuItem1, "Func_MenuItem1")        ; 可以响应事件
                                                GUICtrlCreateMenuItem("菜单项2", $menu)
                                                GUICtrlCreateMenuItem("菜单项3", $menu)
                                        
                                        #cs        
                                        ; _GUICtrlTab_Create创建标签卡:出现
                                        ; GUICtrlCreateTab原生建标签卡:出现
                                        $hMenu = _GUICtrlMenu_CreatePopup()
                                                _GUICtrlMenu_InsertMenuItem($hMenu, 0, "关闭", $menuId_Close)        ; 不知道这种需求下如何点击
                                                _GUICtrlMenu_InsertMenuItem($hMenu, 1, "", 0)
                                                _GUICtrlMenu_InsertMenuItem($hMenu, 2, "保存", $menuId_Save)
                                                _GUICtrlMenu_InsertMenuItem($hMenu, 3, "另存为...", $menuId_Save_As)
                                                _GUICtrlMenu_InsertMenuItem($hMenu, 4, "", 0)
                                                _GUICtrlMenu_InsertMenuItem($hMenu, 5, "打印", $menuId_Print)
                                        
                                                _GUICtrlMenu_TrackPopupMenu($hMenu, $tabWelcome, -1, -1, 1, 1, 2, 0 )
                                                _GUICtrlMenu_DestroyMenu($hMenu)
                                        #ce
                                        
                        EndSwitch

        EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

; 尝试响应 _GUICtrlMenu_CreatePopup 创建的菜单
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If $hWnd = $tabWelcome Then ; 这样也不行 _WinAPI_GetDlgCtrlID($tabWelcome)
                Switch $wParam
                        Case $menuId_Close
                                _WinAPI_ShowMsg("你点击了 [关闭] 菜单")
                        Case $menuId_Save
                                _WinAPI_ShowMsg("你点击了 [保存]  菜单")
                        Case $menuId_Save_As
                                _WinAPI_ShowMsg("你点击了 [另存为] 菜单")
                EndSwitch
        EndIf
EndFunc   ;==>WM_COMMAND

Func Func_MenuItem1()
        ConsoleWrite("右键菜单点击" & @CRLF)
EndFunc
 楼主| 发表于 2015-1-3 11:13:36 | 显示全部楼层
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-28 05:07 , Processed in 0.150933 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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