vigiles 发表于 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

vigiles 发表于 2015-1-3 11:13:36

http://www.autoitx.com/thread-46652-1-1.html
页: [1]
查看完整版本: 【已解决】在标签卡上右键弹出菜单如何响应