找回密码
 加入
搜索
查看: 7444|回复: 13

[GUI管理] 如何模拟右键菜单

  [复制链接]
发表于 2015-6-9 17:39:02 | 显示全部楼层 |阅读模式
悬赏800金钱已解决
本帖最后由 tryhi 于 2015-6-9 18:19 编辑



#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$Form1 = GUICreate("列表视图控件", 220, 250, 100, 200, -1, $WS_EX_ACCEPTFILES)
Local $Listview = GUICtrlCreateListView("点击这里  |列 2|列 3  ", 10, 10, 200, 150) 
$Listview_handle = GUICtrlGetHandle($Listview)
Local $idItem1 = GUICtrlCreateListViewItem("item1|item1|item1", $Listview)
Local $idItem1 = GUICtrlCreateListViewItem("item2|item2|item2", $Listview)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        ExitLoop
        EndSwitch
WEnd

Func WM_NOTIFY($hWndGUI, $MsgID, $WParam, $LParam)
        Local $hWndFrom, $iCode, $tNMHDR
        $tNMHDR = DllStructCreate($tagNMHDR,$LParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $Listview_handle
                        Switch $iCode
                                Case $LVN_COLUMNCLICK
                                        Local $tInfo = DllStructCreate($tagNMLISTVIEW,$LParam)
                                        Local $iCol = DllStructGetData($tInfo, "SubItem")
                                         create_shuaixuan()
                        EndSwitch
        EndSwitch
EndFunc   ;==>WM_NOTIFY
Func create_shuaixuan()
        $mouse_pos = MouseGetPos()
        $Form_shuaixuan = GUICreate("筛选窗口", 160, 253, $mouse_pos[0], $mouse_pos[1],BitOR($WS_SYSMENU, $WS_POPUP),-1,$Form1)
        GUISetBkColor(0xffffff) ; will change background color
        $ListView1 = GUICtrlCreateListView("111            ", 0, 0, 160, 220, $LVS_NOCOLUMNHEADER, _
                                        BitOR($WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT))
;~         $button_shai_yes = GUICtrlCreateButton("确定", 10, 225, 50, 20)
;~         $button_shai_no = GUICtrlCreateButton("取消", 80, 225, 50, 20)
        For $i = 1 To 50
                $item1 = GUICtrlCreateListViewItem("item"&$i, $listview1)
                GUICtrlSetState ($item1,$GUI_CHECKED)
        Next
        GUISetState()
EndFunc

试了注册WM_ACTIVATE消息,但似乎行不通。
不知道这样表达得清不清楚,各位大神运行一下代码应该就能明白



续:--------------------------
我想通过窗口的激活状态来进行判断,但是我发现在消息事件中创建之后的子窗口无论如何都是处于非激活状态,不知道如何让创建之后的子窗口处于激活状态
附件: 您需要 登录 才可以下载或查看,没有账号?加入

最佳答案

查看完整内容

声明一个全局变量 Global $Form_shuaixuan 再在主循环内部(第15行下面)插入一个Case
发表于 2015-6-9 17:39:03 | 显示全部楼层
声明一个全局变量
Global $Form_shuaixuan
再在主循环内部(第15行下面)插入一个Case
                Case -7
                        If IsHwnd($Form_shuaixuan) And Not WinActive($Form_shuaixuan) Then GUIDelete($Form_shuaixuan)

评分

参与人数 1贡献 +2 收起 理由
tryhi + 2 果然还是在主循环里面方便

查看全部评分

发表于 2015-6-9 17:59:55 | 显示全部楼层
第一个问题,在程序第10行前面增加以下语句,我给的是列子,具体你改成你想要的就可以了。
Global $Menu
Global enum $MenuSelectAll=1000,$MenuSelectCopy,$MenuSelectSave;上下文菜单
$Menu=_GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($Menu, 0, " 全选(&A)                 Ctrl+A   ", $MenuSelectAll)
_GUICtrlMenu_InsertMenuItem($Menu, 1, "")
_GUICtrlMenu_InsertMenuItem($Menu, 2, " 复制(&C)  Ctrl+C   ", $MenuSelectCopy)
_GUICtrlMenu_InsertMenuItem($Menu, 3, " 保存(&S)        Ctrl+S   ", $MenuSelectSave)
然后在WM_NOTIFY 中添加对应的处理:
Case $NM_RCLICK
                                        If _GUICtrlListView_GetSelectedIndices($hWndListView1) = "" Then
                                                _GUICtrlMenu_SetItemDisabled($Menu, 0)
                                                _GUICtrlMenu_SetItemDisabled($Menu, 2)
                                                                                                _GUICtrlMenu_SetItemDisabled($Menu, 3)
                                                                                                _GUICtrlMenu_SetItemDisabled($Menu, 1)
                                        Else
                                                _GUICtrlMenu_SetItemEnabled($Menu, 1)
                                                _GUICtrlMenu_SetItemEnabled($Menu, 2)
                                                                                                 _GUICtrlMenu_SetItemEnabled($Menu, 3)
                                                                                                  _GUICtrlMenu_SetItemEnabled($Menu, 0)
                                        EndIf
                                      $SelectedID = _GUICtrlMenu_TrackPopupMenu($Menu, $listview_handle, -1, -1, 1, 1, 2)
                                        If $SelectedID = $MenuSelectALL Then
                                               ; MsgBox(0,"","您点击了全选")
                                                                                                _GUICtrlListView_SetItemSelected($listview1,-1)

                                        EndIf
                                        If $SelectedID = $MenuSelectCopy Then
                                              ;  MsgBox(0,"","您点击了复制")
                        endif                                                                                                         If $SelectedID = $MenuSelectSave Then
                                                ;MsgBox(0,"","您点击了保存")
   EndIf

评分

参与人数 1金钱 +20 收起 理由
tryhi + 20 感谢关注

查看全部评分

发表于 2015-6-9 18:01:27 | 显示全部楼层
把代码中的$hWndListView1 换成你程序中对应的 $listview_handle

评分

参与人数 1金钱 +20 收起 理由
tryhi + 20 感谢关注

查看全部评分

 楼主| 发表于 2015-6-9 18:02:12 | 显示全部楼层
回复 2# macran


    不好意思,你还没理解我的意思,我不是要创建右键菜单
发表于 2015-6-9 18:03:13 | 显示全部楼层
把代码中的$hWndListView1 换成你程序中对应的 $listview_handle
如果要实现点击右键菜单某项的功能,就把各个对应的MSGBOX换成你自己要处理的代码,比如我的全选。已经实现了。

评分

参与人数 1金钱 +20 收起 理由
tryhi + 20 感谢关注

查看全部评分

发表于 2015-6-9 18:07:32 | 显示全部楼层
你不用新建窗口,用右键菜单试试呢。

评分

参与人数 1金钱 +80 收起 理由
tryhi + 80 感谢关注

查看全部评分

 楼主| 发表于 2015-6-9 18:08:50 | 显示全部楼层
本帖最后由 tryhi 于 2015-6-9 18:11 编辑

回复 5# macran


    我的意思是我创建的这个窗口如何才能跟右键菜单一样,当点击了其他地方的时候自动隐藏掉
我就是不要用右键菜单啊,右键菜单能实现跟excel这样的功能吗?



本帖子中包含更多资源

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

×
发表于 2015-6-9 18:20:46 | 显示全部楼层
在你的代码30行之后添加以下代码
 Case $NM_CLICK
                                                                        GUIDelete($Form_shuaixuan)

评分

参与人数 1金钱 +10 收起 理由
tryhi + 10 这个事件只对项目有效,标题无效

查看全部评分

发表于 2015-6-9 18:28:01 | 显示全部楼层
同时,你的create_shuaxin 要考虑怎么不重复显示弹出窗口。自己考虑吧。我要下班了。
发表于 2015-6-9 18:34:38 | 显示全部楼层
Global $Form_shuaixuan
放在程序第4行
 楼主| 发表于 2015-6-9 18:46:04 | 显示全部楼层
回复 9# macran


    吃饭去,一会试一下,重复问题不是问题
发表于 2015-6-9 21:45:50 | 显示全部楼层
回复 12# afan


    A版果然神人~
发表于 2015-6-10 09:37:20 | 显示全部楼层
佩服佩服佩服
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 11:25 , Processed in 0.083201 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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