tryhi 发表于 2015-6-9 17:39:02

如何模拟右键菜单

本帖最后由 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, $mouse_pos,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消息,但似乎行不通。
不知道这样表达得清不清楚,各位大神运行一下代码应该就能明白


续:--------------------------
我想通过窗口的激活状态来进行判断,但是我发现在消息事件中创建之后的子窗口无论如何都是处于非激活状态,不知道如何让创建之后的子窗口处于激活状态

afan 发表于 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)

macran 发表于 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

macran 发表于 2015-6-9 18:01:27

把代码中的$hWndListView1 换成你程序中对应的 $listview_handle

tryhi 发表于 2015-6-9 18:02:12

回复 2# macran


    不好意思,你还没理解我的意思,我不是要创建右键菜单

macran 发表于 2015-6-9 18:03:13

把代码中的$hWndListView1 换成你程序中对应的 $listview_handle
如果要实现点击右键菜单某项的功能,就把各个对应的MSGBOX换成你自己要处理的代码,比如我的全选。已经实现了。

macran 发表于 2015-6-9 18:07:32

你不用新建窗口,用右键菜单试试呢。

tryhi 发表于 2015-6-9 18:08:50

本帖最后由 tryhi 于 2015-6-9 18:11 编辑

回复 5# macran


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



macran 发表于 2015-6-9 18:20:46

在你的代码30行之后添加以下代码
Case $NM_CLICK
                                                                        GUIDelete($Form_shuaixuan)

macran 发表于 2015-6-9 18:28:01

同时,你的create_shuaxin 要考虑怎么不重复显示弹出窗口。自己考虑吧。我要下班了。

macran 发表于 2015-6-9 18:34:38

Global $Form_shuaixuan
放在程序第4行

tryhi 发表于 2015-6-9 18:46:04

回复 9# macran


    吃饭去,一会试一下,重复问题不是问题

haijie1223 发表于 2015-6-9 21:45:50

回复 12# afan


    A版果然神人~

macran 发表于 2015-6-10 09:37:20

佩服佩服佩服
页: [1]
查看完整版本: 如何模拟右键菜单