vigiles 发表于 2015-1-2 17:19:35

【已解决】GUICtrlCreateContextMenu是否和MouseClick冲突

本帖最后由 vigiles 于 2015-1-3 11:12 编辑

使用GUICtrlCreateTab创建标签卡,使用GUICtrlCreateContextMenu为标签卡添加右键菜单,在GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")中监听右键菜单,获取到时通过MouseClick("left")来点击切换标签。但似乎不知何故,MouseClick("left")执行了,标签卡却没有反应,似乎MouseClick没有作用到标签卡上。下图是当前有bug展示:


希望各位网友帮忙解决,右键标签时,切换标签并弹出菜单
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <GuiTab.au3>
#include <TabConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

$guiWelcome = GUICreate("淡淡的顶顶顶顶顶顶顶顶顶顶", 400, 200)
      GUISetOnEvent($GUI_EVENT_CLOSE, "Func_GUI_EVENT_CLOSE")
      
      ; 1.创建标签卡
      $tabWelcome = GUICtrlCreateTab(1, 27, 298, 130)
                GUICtrlSetOnEvent($tabWelcome, "Func_TabWelcome")                ; 单击事件处理
               
                _GUICtrlTab_InsertItem ( $tabWelcome, 0, "标签页0")
                _GUICtrlTab_InsertItem ( $tabWelcome, 1, "标签页1")
               
                #cs
                        不使用菜单时,MouseClick 可以切换标签,但同时发生单击事件。
                        这个菜单是一定得用的。此时 MouseClick 语句执行发回值为 1-成功,但并不换标签
                #ce
                $menu = GUICtrlCreateContextMenu($tabWelcome)
                        $menuItem1 = GUICtrlCreateMenuItem("菜单项1", $menu)
                              GUICtrlSetOnEvent($menuItem1, "Func_MenuItem1")
                        GUICtrlCreateMenuItem("菜单项2", $menu)
                        GUICtrlCreateMenuItem("菜单项3", $menu)
               
GUISetState(@SW_SHOW, $guiWelcome)

; 注册消息。右击时 发送鼠标点击事件
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")

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

Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam)
      If $wParam = GUICtrlGetHandle($tabWelcome) Then
               
                MouseClick("left")      ; 返回1,成功。但是标签未切换
               
                ; 得到当前选中的标签索引
                ConsoleWrite("右击标签卡:" & _GUICtrlTab_GetCurSel($tabWelcome) & @CRLF)
      EndIf
EndFunc

Func Func_MenuItem1()
      ConsoleWrite("鼠标菜单点击了" & @CRLF)
EndFunc

Func Func_TabWelcome ()
      $ctrlId = GUICtrlRead (@GUI_CtrlId)
      $itemText = _GUICtrlTab_GetItemText(@GUI_CtrlId, $ctrlId)
      ConsoleWrite("左击标签卡:" & $ctrlId & " - " & $itemText & @CRLF)
EndFunc

Func Func_GUI_EVENT_CLOSE ()
      Exit
EndFunc

zhouhaijin 发表于 2015-1-2 18:45:53

为什么不用ControlCommand ( "窗口标题", "窗口文本", 控件ID, "TabLeft,TabRight" [, "选项"] )

vigiles 发表于 2015-1-2 19:10:39

回复 2# zhouhaijin


    试过不行。谢谢

eaglelin 发表于 2015-1-3 00:11:40

你没有写 各个菜单项的动作!

vigiles 发表于 2015-1-3 00:24:13

回复 4# eaglelin


    代码中写了。另外我这个例子所说的问题不是关于菜单项的,而是右键。

seniors 发表于 2015-1-3 10:48:41


Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam)
        Local $x, $y, $aHit
        If $wParam = GUICtrlGetHandle($tabWelcome) Then
                $x = _WinAPI_GetMousePosX(True, $wParam)
                $y = _WinAPI_GetMousePosY(True, $wParam)
                $aHit = _GUICtrlTab_HitTest($tabWelcome, $x, $y)
                _GUICtrlTab_SetCurSel($tabWelcome, $aHit)
                ; 得到当前选中的标签索引
                ConsoleWrite("右击标签卡:" & _GUICtrlTab_GetCurSel($tabWelcome) & @CRLF)
        EndIf
EndFunc   ;==>WM_CONTEXTMENU

vigiles 发表于 2015-1-3 10:57:39

回复 6# seniors


    大牛!
但我没明白,标签是如何被选中的,_GUICtrlTab_HitTest?帮助文档中“确定(标签选项卡)控件测试点位所在位置.”太让人费解了

seniors 发表于 2015-1-3 11:18:19

本帖最后由 seniors 于 2015-1-3 11:19 编辑

_GUICtrlTab_HitTest根据鼠标位置确定鼠标在第几个标签上,返回结果在$aHit
选中是_GUICtrlTab_SetCurSel这个函数操作的

vigiles 发表于 2015-1-3 11:39:25

回复 8# seniors


    3ks !熟悉帮助文档太重要了{:face (293):}

wangms 发表于 2015-1-15 09:06:44

学习学习。。。。。。。。。。。。。。。。。。
页: [1]
查看完整版本: 【已解决】GUICtrlCreateContextMenu是否和MouseClick冲突