找回密码
 加入
搜索
查看: 2898|回复: 44

[AU3基础] [已解决]GUICtrlCreateMenuItem右键菜单怎么隐藏

[复制链接]
发表于 2022-4-3 11:14:42 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2022-4-6 08:30 编辑

在ListView控件上,用GUICtrlCreateMenuItem注册右键菜单,请教如何实现,在创建后先隐藏,等Listview有了数据,才能显示出来,一旦数据没有了,又隐藏起来呢?我试了用Guictrlsetstate设置隐藏和启用,没有反应,所以只能设置它的状态为禁用和启用,但是禁用后还是能看到。

解决了
<p>#NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n
#include <GuiListView.au3>
#include <WindowsConstants.au3>
#include <GuiMenu.au3>
Opt("GuiOnEventMode", 1)
Global Enum $idOpen = 1000 ;Listview右键</p><p>Global $idGui = GUICreate("", 420, 500)</p><p>DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0)
Global $idListview = GUICtrlCreateListView("", 10, 50, 400, 136, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
GUICtrlSetBkColor(-1, 0xFFFBF0)
$iStyle = BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $WS_EX_CLIENTEDGE, $LVS_EX_INFOTIP, $LVS_EX_SUBITEMIMAGES)
_GUICtrlListView_SetExtendedListViewStyle($idListview, $iStyle) ;设置扩展样式
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 7)
_GUICtrlListView_AddColumn($idListview, "值", 60)
_GUICtrlListView_AddColumn($idListview, "域", 130)
Global $hListview = GUICtrlGetHandle($idListview)
GUISetState()
GUISetOnEvent(-3, "_Exit")</p><p>GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") ;$WM_COMMAND:0x0111,当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU") ;$WM_CONTEXTMENU:0x007B,当用户某个窗口中点击了一下右键就发送此消息给这个窗口</p><p>Global $aArrayList[5][2] = [["状态", "证书有效"], ["序列号", "ABCDEFGH"], ["持有者", "DDDDDDDDD"], ["指纹", "GGGGGGGGGGG"], ["有效期", "20220406"]]
_GUICtrlListView_AddArray($idListview, $aArrayList)</p><p>While 1
 Sleep(10)
WEnd </p><p>Func _CopyItems()
 MsgBox(0, 0, "右键菜单测试。如果把数组$aArrayList清空,则不会弹出右键菜单!", "", $idGui)
EndFunc</p><p>Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) ;$WM_COMMAND:0x0111,当用户选择一条菜单命令项或当某个控件发送一条消息给它的父窗口
 Switch $iwParam
  Case $idOpen
   _CopyItems()
 EndSwitch
EndFunc   ;==>WM_COMMAND</p><p>Func WM_CONTEXTMENU($hWnd, $iMsg, $iwParam, $ilParam) ;$WM_CONTEXTMENU:0x007B,当用户某个窗口中点击了一下右键就发送此消息给这个窗口
 Local $gUK_Text
 Local $iCols = _GUICtrlListView_GetColumnCount($idListview) ;检索列表视图列数
 Local $iRows = _GUICtrlListView_GetItemCount($idListview) ;检索列表视图行数
 For $i = 0 To $iRows - 1
  For $j = 0 To $iCols - 1
   If _GUICtrlListView_GetItemText($idListview, $i, $j) = "证书有效" Then
    $gUK_Text = "证书有效"
    ExitLoop
   EndIf
  Next
 Next
 Switch $iwParam
  Case $hListview ;必须是句柄才行,不能是是控件的ID
   If $gUK_Text <> "" Then
    Local $hMenu = _GUICtrlMenu_CreatePopup() ;创建下拉菜单, 子菜单或快捷菜单.
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "复制", $idOpen) ;插入一个新菜单项到指定位置.(使用参数)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hWnd) ;在指定位置显示一个快捷菜单
    _GUICtrlMenu_DestroyMenu($hMenu) ;销毁指定菜单, 并释放菜单占用的内存
    Return True
   EndIf
 EndSwitch
EndFunc   ;==>WM_CONTEXTMENU</p><p>Func _Exit()
 Exit
EndFunc
</p>
发表于 2022-4-3 11:31:21 | 显示全部楼层
GUICtrlSetState(控件ID, 32);隐藏控件.
GUICtrlSetState(控件ID, 16);启用控件




 楼主| 发表于 2022-4-3 11:48:16 | 显示全部楼层
chzj589 发表于 2022-4-3 11:31
GUICtrlSetState(控件ID, 32);隐藏控件.
GUICtrlSetState(控件ID, 16);启用控件

我试过了,无法隐藏。
发表于 2022-4-3 15:28:53 | 显示全部楼层
smooth 发表于 2022-4-3 11:48
我试过了,无法隐藏。

上源码...


0-0=0-==--=-=-=-=-=
 楼主| 发表于 2022-4-3 17:07:00 | 显示全部楼层
#NoTrayIcon
#RequireAdmin
#PRE_UseX64 = n 
 
GUICreate("", 300, 300)
Global $idButton = GUICtrlCreateButton("", 80, 100, 80, 40)
Global $idButtoncontext = GUICtrlCreateContextMenu($idButton)
Global $idMenuAbout = GUICtrlCreateMenuItem("复制", $idButtoncontext)
GUICtrlSetState($idMenuAbout, 32)
GUISetState()
While 1
 If GUIGetMsg() = -3 Then Exit
WEnd

发表于 2022-4-3 17:29:09 | 显示全部楼层
#NoTrayIcon
#RequireAdmin
GUICreate("", 300, 300)
Global $idButton = GUICtrlCreateButton("", 80, 100, 80, 40)
Global $idCheckbox = GUICtrlCreateCheckbox("隐藏右键菜单", 80, 180)
Global $idButtoncontext = GUICtrlCreateContextMenu($idButton)
Global $idMenuAbout = GUICtrlCreateMenuItem("复制", $idButtoncontext)
GUICtrlSetState($idMenuAbout, 32)
GUISetState()

While 1
        Switch GUIGetMsg()
                Case -3
                        Exit
                Case $idCheckbox
                        If GUICtrlRead($idCheckbox) = 1 Then 
                                GUIRegisterMsg(0x007B, "WM_CONTEXTMENU")
                        Else
                                GUIRegisterMsg(0x007B, "")
                        EndIf

        EndSwitch                
WEnd

Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Return True
EndFunc   ;==>WM_CONTEXTMENU



发表于 2022-4-3 17:58:19 | 显示全部楼层
本帖最后由 chzj589 于 2022-4-3 19:50 编辑

把按钮隐藏可以吗?

GUICreate("", 300, 300)
Global $idButton = GUICtrlCreateButton("右键菜单", 80, 100, 80, 40)
Global $idButton1 = GUICtrlCreateButton("右键菜单隐藏", 80, 100, 80, 40)
GUICtrlSetState($idButton1, 32)
Global $idButtoncontext = GUICtrlCreateContextMenu($idButton)
Global $idMenuAbout = GUICtrlCreateMenuItem("复制", $idButtoncontext)
GUISetState()
While 1
        Switch GUIGetMsg()
                Case -3
                        Exit
                Case $idButton
                        GUICtrlSetState($idButton1, 16)
                        GUICtrlSetState($idButton, 32)
                Case $idButton1
                        GUICtrlSetState($idButton1, 32)
                        GUICtrlSetState($idButton, 16)
        EndSwitch
WEnd


 楼主| 发表于 2022-4-3 23:26:41 | 显示全部楼层

做了测试可以,放到我代码里再测试看看,谢谢大佬出手。
 楼主| 发表于 2022-4-3 23:27:26 | 显示全部楼层
chzj589 发表于 2022-4-3 17:58
把按钮隐藏可以吗?

不是要隐藏按钮。我上面只是例子,我实际是要在LISTVIEW上做的右键菜单,不能隐藏LISTVIEW的。
 楼主| 发表于 2022-4-4 06:15:01 | 显示全部楼层
本帖最后由 smooth 于 2022-4-4 06:18 编辑
chzj589 发表于 2022-4-3 17:58
把按钮隐藏可以吗?

用在LISTVIEW上,如果有数据,就可以弹出右键,没有数据就不弹出右键,事件模式,不增加额外的控制按钮(比如你实例中的Checkbox),我试了一下,不行。
发表于 2022-4-4 08:18:09 | 显示全部楼层
smooth 发表于 2022-4-4 06:15
用在LISTVIEW上,如果有数据,就可以弹出右键,没有数据就不弹出右键,事件模式,不增加额外的控制按钮( ...

把要解决的问题说清楚!
如是LISTVIEW上的右键菜单,用注册 Windows 消息,
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
Case  $NM_RCLICK ; 鼠标右键单击做判断
 楼主| 发表于 2022-4-4 08:54:39 | 显示全部楼层
本帖最后由 smooth 于 2022-4-4 09:08 编辑
chzj589 发表于 2022-4-4 08:18
把要解决的问题说清楚!
如是LISTVIEW上的右键菜单,用注册 Windows 消息,
GUIRegisterMsg($WM_NOTIFY ...

怪我。我以为是所有的按钮上的右键,都有同样的一个窗口操作函数来隐藏和显示,所以拿个BUTTON来做例子。我已经修改了提问的内容了。


 楼主| 发表于 2022-4-4 09:57:04 | 显示全部楼层
chzj589 发表于 2022-4-4 08:18
把要解决的问题说清楚!
如是LISTVIEW上的右键菜单,用注册 Windows 消息,
GUIRegisterMsg($WM_NOTIFY ...

是这样子写吗?试了没有反应。



本帖子中包含更多资源

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

×
发表于 2022-4-4 10:02:36 | 显示全部楼层
smooth 发表于 2022-4-4 09:57
是这样子写吗?试了没有反应。

搜索相关<ListView>的帖子找答案
发表于 2022-4-4 10:04:18 | 显示全部楼层
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY') Case  $NM_RCLICK ; 鼠标右键单击做判断
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 09:11 , Processed in 0.078805 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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