【已解决】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
为什么不用ControlCommand ( "窗口标题", "窗口文本", 控件ID, "TabLeft,TabRight" [, "选项"] ) 回复 2# zhouhaijin
试过不行。谢谢 你没有写 各个菜单项的动作! 回复 4# eaglelin
代码中写了。另外我这个例子所说的问题不是关于菜单项的,而是右键。
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 回复 6# seniors
大牛!
但我没明白,标签是如何被选中的,_GUICtrlTab_HitTest?帮助文档中“确定(标签选项卡)控件测试点位所在位置.”太让人费解了 本帖最后由 seniors 于 2015-1-3 11:19 编辑
_GUICtrlTab_HitTest根据鼠标位置确定鼠标在第几个标签上,返回结果在$aHit
选中是_GUICtrlTab_SetCurSel这个函数操作的 回复 8# seniors
3ks !熟悉帮助文档太重要了{:face (293):} 学习学习。。。。。。。。。。。。。。。。。。
页:
[1]