找回密码  加入

AUTOIT CN

搜索
查看: 12498|回复: 4

[GUI管理] [已解决]TreeView双击项目事件、右击菜单事件等问题

[复制链接]
发表于 2014-8-27 11:51:41 | 显示全部楼层 |阅读模式
本帖最后由 雪栀 于 2014-8-28 09:48 编辑

解决方案见2楼和4楼,在官网发现一个鼠标事件相关的UDF,我可能会改一下、整合一些功能发上来。

===============================================================================

提问之前我翻了帮助和论坛的帖子,找了一堆相关的例子,包括ListView的双击、右击问题(是的我没写错,大多数是ListView的例子。。。),已经用GUIRegisterMsg的方式解决了双击TreeView项目激发事件的问题,但是现在有如下几个问题:

1、右击某项目可弹出菜单,但点击菜单无效;
2、点击退出按钮无效


下面这个问题无所谓了,只是探讨一下:
[3、另外一个单独的小问题:在单击空白处时能不能不选中TreeView里的项目?右击空白处时弹出菜单,但菜单选项不可用?→_→这个是不是应该另开一贴……]

备注:运行时请选择x86,否则双击没反映,可能是某些函数对x64的支持有缺陷

把菜单和按钮产生的消息用GUIGetMsg获取,写到While 1……WEnd这一段里,是可以生效的,我是想问能不能用注册消息的方式实现,最近在了解GUIRegisterMsg,注册不同的消息模拟多线程

代码只是示例……写的有点乱……
  1. #include <GuiConstants.au3>
  2. #include <GuiTreeView.au3>
  3. #NoTrayIcon

  4. Dim $inifile_path = "playlist.ini"
  5. If Not FileExists($inifile_path) Then
  6.         FileInstall("playlist.ini", $inifile_path)
  7. EndIf

  8. Dim $csname = "List", $hClass = 0
  9. $Manage = GUICreate("选择", 300, 300, (@DesktopWidth - 215) / 2, (@DesktopHeight - 100) / 2)
  10. $treeview = GUICtrlCreateTreeView(0, 0, 200, 300, -1, $WS_EX_CLIENTEDGE)
  11. readinfo($inifile_path, $treeview) ;加载ini

  12. ;右键菜单
  13. $Menu = GUICtrlCreateContextMenu($treeview)
  14. $rclk = GUICtrlCreateMenuItem("萌萌的菜单", $Menu)

  15. ;备用按钮
  16. $exit = GUICtrlCreateButton("退出", 216, 180, 67, 25)

  17. GUISetState(@SW_SHOW, $Manage)
  18. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

  19. While 1
  20.         Local $msg = GUIGetMsg()
  21.         Select
  22.                 Case $msg = -3
  23.                         Exit
  24.         EndSelect
  25. WEnd

  26. Func readinfo($ini, $htv, $csname = "List", $hClass = 0)  ;加载ini
  27.         If Not $hClass Then $hClass = $htv
  28.         $aSec = IniReadSection($ini, $csname)
  29.         If @error Then Return False
  30.         For $i = 1 To $aSec[0][0]
  31.                 $child = IniReadSection($ini, $aSec[$i][0])
  32.                 If @error Then;类
  33.                         $hItem = GUICtrlCreateTreeViewItem($aSec[$i][0], $hClass)
  34.                 Else;子类
  35.                         $hClass1 = GUICtrlCreateTreeViewItem($aSec[$i][0], $hClass)
  36.                         readinfo($ini, $hClass, $aSec[$i][0], $hClass1)
  37.                 EndIf
  38.         Next
  39.         Return True
  40. EndFunc   ;==>readinfo

  41. Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam) ;注册消息,待修改
  42.         Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
  43.         $tagNMHDR = DllStructCreate("int;int;int", $LParam)
  44.         If @error Then Return $GUI_RUNDEFMSG
  45.         $IDFrom = DllStructGetData($tagNMHDR, 2)
  46.         $Event = DllStructGetData($tagNMHDR, 3)
  47.         $tagNMHDR = 0
  48.         Switch $IDFrom ;选择产生事件的控件
  49.                 Case $treeview
  50.                         Switch $Event ;选择产生的事件
  51.                                 Case $NM_CLICK ; 左击
  52.                                 Case $NM_DBLCLK ; 双击
  53.                                         $Index = _GUICtrlTreeView_GetSelection($treeview)
  54.                                         If Not $Index Then Return; 这里用以判断是否选定了TreeViewItem
  55.                                         MsgBox(0,0,"双击了" & GUICtrlRead($treeview, 1))
  56.                                 Case $NM_RCLICK ; 右击
  57.                                         ;MsgBox(0,"","右击!") ;调试
  58.                         EndSwitch
  59.                 Case $rclk
  60.                         Switch $Event ;选择产生的事件
  61.                                 Case $NM_CLICK ; 左击
  62.                                         MsgBox(0,0,"菜单:" & GUICtrlRead($treeview, 1))
  63.                         EndSwitch
  64.                 Case $exit
  65.                         Switch $Event ;选择产生的事件
  66.                                 Case $NM_CLICK ; 左击
  67.                                         Exit
  68.                         EndSwitch
  69.         EndSwitch
  70.         Return $GUI_RUNDEFMSG
  71. EndFunc   ;==>WM_NOTIFY
复制代码
playlist.ini文件:
  1. [List]
  2. List1=List1
  3. List2=List2

  4. [List1]
  5. 1=0001
  6. 2=0010

  7. [List2]
  8. 3=0011
复制代码


类似问题也在激烈讨论中http://www.autoitx.com/forum.php?mod=viewthread&tid=45019,我在22楼的回答(http://www.autoitx.com/forum.php ... mp;extra=#pid592224)又换了一种写法,问题依然没有解决。希望这类单击、双击、右击控件的问题解决后,大家可以整合一下别的什么GUICtrlOnHover之类的,写个强大的鼠标事件UDF

本帖子中包含更多资源

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

x
发表于 2014-8-27 18:54:20 | 显示全部楼层
将就着看一下吧,仅供参考

  1. #include <GuiConstants.au3>
  2. #include <GuiTreeView.au3>
  3. #NoTrayIcon

  4. Dim $inifile_path = "playlist.ini"
  5. If Not FileExists($inifile_path) Then
  6.         FileInstall("playlist.ini", $inifile_path)
  7. EndIf

  8. Dim $csname = "List", $hClass = 0
  9. $Manage = GUICreate("选择", 300, 300, (@DesktopWidth - 215) / 2, (@DesktopHeight - 100) / 2)
  10. $treeview = GUICtrlCreateTreeView(0, 0, 200, 300, -1, $WS_EX_CLIENTEDGE)
  11. readinfo($inifile_path, $treeview) ;加载ini

  12. ;右键菜单
  13. $Menu = GUICtrlCreateContextMenu($treeview)
  14. $rclk = GUICtrlCreateMenuItem("萌萌的菜单", $Menu)

  15. ;备用按钮
  16. $exit = GUICtrlCreateButton("退出", 216, 180, 67, 25)

  17. GUISetState(@SW_SHOW, $Manage)
  18. GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
  19. GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

  20. While 1
  21.         Local $msg = GUIGetMsg()
  22.         Select
  23.                 Case $msg = -3
  24.                         Exit
  25.         EndSelect
  26. WEnd

  27. Func readinfo($ini, $htv, $csname = "List", $hClass = 0) ;加载ini
  28.         If Not $hClass Then $hClass = $htv
  29.         $aSec = IniReadSection($ini, $csname)
  30.         If @error Then Return False
  31.         For $i = 1 To $aSec[0][0]
  32.                 $child = IniReadSection($ini, $aSec[$i][0])
  33.                 If @error Then;类
  34.                         $hItem = GUICtrlCreateTreeViewItem($aSec[$i][0], $hClass)
  35.                 Else;子类
  36.                         $hClass1 = GUICtrlCreateTreeViewItem($aSec[$i][0], $hClass)
  37.                         readinfo($ini, $hClass, $aSec[$i][0], $hClass1)
  38.                 EndIf
  39.         Next
  40.         Return True
  41. EndFunc   ;==>readinfo

  42. Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam) ;注册消息,待修改
  43.         Local $tagNMHDR, $Event, $hWndFrom, $IDFrom
  44.         $tagNMHDR = DllStructCreate("int;int;int", $LParam)
  45.         If @error Then Return $GUI_RUNDEFMSG
  46.         $IDFrom = DllStructGetData($tagNMHDR, 2)
  47.         $Event = DllStructGetData($tagNMHDR, 3)
  48.         $tagNMHDR = 0
  49.         ConsoleWrite($IDFrom & @CRLF)
  50.         Switch $IDFrom ;选择产生事件的控件
  51.                 Case $treeview
  52.                         Switch $Event ;选择产生的事件
  53.                                 Case $NM_CLICK ; 左击
  54.                                 Case $NM_DBLCLK ; 双击
  55.                                         $Index = _GUICtrlTreeView_GetSelection($treeview)
  56.                                         If Not $Index Then Return; 这里用以判断是否选定了TreeViewItem
  57.                                         MsgBox(0, 0, "双击了" & GUICtrlRead($treeview, 1))
  58.                                 Case $NM_RCLICK ; 右击
  59.                                         ;MsgBox(0,"","右击!") ;调试
  60.                         EndSwitch
  61.                 Case $rclk

  62.                         Switch $Event ;选择产生的事件
  63.                                 Case $NM_CLICK ; 左击
  64.                                         MsgBox(0, 0, "菜单:" & GUICtrlRead($treeview, 1))
  65.                         EndSwitch
  66.                        
  67.                        
  68.         EndSwitch
  69.         Return $GUI_RUNDEFMSG
  70. EndFunc   ;==>WM_NOTIFY

  71. Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
  72.         #forceref $hWnd, $Msg
  73.         Local $nNotifyCode = BitShift($wParam, 16)
  74.         Local $nID = BitAND($wParam, 0x0000FFFF)
  75.         Local $hCtrl = $lParam


  76.         Switch $nID
  77.                 Case $exit
  78.                         Switch $nNotifyCode
  79.                                 Case 0
  80.                                         Exit
  81.                         EndSwitch
  82.                 Case $rclk
  83.                         Switch $nNotifyCode
  84.                                 Case 0
  85.                                         MsgBox(0, "", "不要点我!")
  86.                         EndSwitch
  87.         EndSwitch

  88.         Return $GUI_RUNDEFMSG
  89. EndFunc   ;==>WM_COMMAND
复制代码

评分

1

查看全部评分

 楼主| 发表于 2014-8-27 20:04:12 | 显示全部楼层
回复 2# gto250


    非常感谢。但可否解释一下WM_NOTIFY、WM_COMMAND这两个消息有什么不同,为什么针对有的控件有效、有的控件无效呢?

    另外您给出的代码的第97行,我想判断一下右击的位置可以吗?但是右击貌似不会改变当前选中项目。比如第97行改成MsgBox(0, 0, "右击菜单:" & GUICtrlRead($treeview, 1)),运行,默认选中的是List1,此时右击List2点菜单,MsgBox却提示右击了List1
发表于 2014-8-28 08:17:30 | 显示全部楼层
回复 3# 雪栀


    在你的右键响应函数里加上 GUIGetCursorInfo  这个来判断鼠标的坐标, 再根据具体的坐标执行相应的操作.

评分

1

查看全部评分

 楼主| 发表于 2014-8-28 09:44:48 | 显示全部楼层
回复 4# lanfengc


    感谢提醒,我知道了!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2020-7-12 23:40 , Processed in 0.296875 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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