找回密码
 加入
搜索
查看: 6052|回复: 9

[GUI管理] 【已解决】GUICtrlCreateContextMenu是否和MouseClick冲突

  [复制链接]
发表于 2015-1-2 17:19:35 | 显示全部楼层 |阅读模式
本帖最后由 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-1-2 18:45:53 | 显示全部楼层
为什么不用ControlCommand ( "窗口标题", "窗口文本", 控件ID, "TabLeft,TabRight" [, "选项"] )
 楼主| 发表于 2015-1-2 19:10:39 | 显示全部楼层
回复 2# zhouhaijin


    试过不行。谢谢
发表于 2015-1-3 00:11:40 | 显示全部楼层
你没有写 各个菜单项的动作  !
 楼主| 发表于 2015-1-3 00:24:13 | 显示全部楼层
回复 4# eaglelin


    代码中写了。另外我这个例子所说的问题不是关于菜单项的,而是右键。
发表于 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[0])
                ; 得到当前选中的标签索引
                ConsoleWrite("右击标签卡:" & _GUICtrlTab_GetCurSel($tabWelcome) & @CRLF)
        EndIf
EndFunc   ;==>WM_CONTEXTMENU
 楼主| 发表于 2015-1-3 10:57:39 | 显示全部楼层
回复 6# seniors


    大牛!
但我没明白,标签是如何被选中的,_GUICtrlTab_HitTest?帮助文档中“确定(标签选项卡)控件测试点位所在位置.”太让人费解了
发表于 2015-1-3 11:18:19 | 显示全部楼层
本帖最后由 seniors 于 2015-1-3 11:19 编辑

_GUICtrlTab_HitTest根据鼠标位置确定鼠标在第几个标签上,返回结果在$aHit[0]
选中是_GUICtrlTab_SetCurSel这个函数操作的
 楼主| 发表于 2015-1-3 11:39:25 | 显示全部楼层
回复 8# seniors


    3ks !熟悉帮助文档太重要了  
发表于 2015-1-15 09:06:44 | 显示全部楼层
学习学习。。。。。。。。。。。。。。。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 02:19 , Processed in 0.119426 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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