如何模拟右键菜单
本帖最后由 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消息,但似乎行不通。
不知道这样表达得清不清楚,各位大神运行一下代码应该就能明白
续:--------------------------
我想通过窗口的激活状态来进行判断,但是我发现在消息事件中创建之后的子窗口无论如何都是处于非激活状态,不知道如何让创建之后的子窗口处于激活状态 声明一个全局变量
Global $Form_shuaixuan
再在主循环内部(第15行下面)插入一个Case Case -7
If IsHwnd($Form_shuaixuan) And Not WinActive($Form_shuaixuan) Then GUIDelete($Form_shuaixuan) 第一个问题,在程序第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
把代码中的$hWndListView1 换成你程序中对应的 $listview_handle 回复 2# macran
不好意思,你还没理解我的意思,我不是要创建右键菜单 把代码中的$hWndListView1 换成你程序中对应的 $listview_handle
如果要实现点击右键菜单某项的功能,就把各个对应的MSGBOX换成你自己要处理的代码,比如我的全选。已经实现了。 你不用新建窗口,用右键菜单试试呢。 本帖最后由 tryhi 于 2015-6-9 18:11 编辑
回复 5# macran
我的意思是我创建的这个窗口如何才能跟右键菜单一样,当点击了其他地方的时候自动隐藏掉
我就是不要用右键菜单啊,右键菜单能实现跟excel这样的功能吗?
在你的代码30行之后添加以下代码
Case $NM_CLICK
GUIDelete($Form_shuaixuan)
同时,你的create_shuaxin 要考虑怎么不重复显示弹出窗口。自己考虑吧。我要下班了。 Global $Form_shuaixuan
放在程序第4行 回复 9# macran
吃饭去,一会试一下,重复问题不是问题 回复 12# afan
A版果然神人~ 佩服佩服佩服
页:
[1]