找回密码  加入

AUTOIT CN

搜索
123
返回列表 发新帖
楼主: heroxianf

[GUI管理] 想模仿JS的一个联动菜单,请指点一下[已解决]

[复制链接]
 楼主| 发表于 2018-10-3 09:23:24 | 显示全部楼层
afan 发表于 2018-10-2 10:49
说到点子上了…  而且这个设计非常重要

物尽其用,不要浪费了现有的数据(如LZ的ini数据,“关键字=值 ...

A大,这个下拉菜单是点击后实时创建,我这里创建下来有一点延迟,鼠标一拖动,弹出的菜单会移动,能不能把下拉菜单固定在控件处弹出?
发表于 2018-10-3 09:58:08 | 显示全部楼层
可以考虑用三个并排的List控件来模拟
 楼主| 发表于 2018-10-3 10:08:25 | 显示全部楼层
顽固不化 发表于 2018-10-3 09:58
可以考虑用三个并排的List控件来模拟

嗯  两个方法我都实现了,现在看看哪个用的比较方便,点击率少一点最好。
发表于 2018-10-3 10:45:56 | 显示全部楼层
heroxianf 发表于 2018-10-3 09:23
A大,这个下拉菜单是点击后实时创建,我这里创建下来有一点延迟,鼠标一拖动,弹出的菜单会移动,能不能 ...
  1. #include <GuiMenu.au3>

  2. Local $hGUI = GUICreate('test')
  3. GUISetState(@SW_SHOW)
  4. GUICtrlCreateLabel('点击选择  >', 10, 10, 92, 15, 0x201)
  5. GUICtrlSetColor(-1, 0xffffff)
  6. GUICtrlSetBkColor(-1, 0x555555)

  7. While 1
  8.         Switch GUIGetMsg()
  9.                 Case -3
  10.                         Exit
  11.                 Case 3
  12.                         Local $hMenu = _GUICtrlMenu_CreatePopup()
  13.                         Local $hMenuC
  14.                         For $ii = 1 To 5
  15.                                 $hMenuC = _GUICtrlMenu_CreateMenu()
  16.                                 For $jj = 1 To 3
  17.                                         _GUICtrlMenu_AddMenuItem($hMenuC, '子菜单 ' & $jj)
  18.                                 Next
  19.                                 _GUICtrlMenu_AddMenuItem($hMenu, '主菜单 ' & $ii, 0, $hMenuC)
  20.                         Next
  21.                         Local $tPoint = DllStructCreate('int X;int Y')
  22.                         DllStructSetData($tPoint, 'X', 10)
  23.                         DllStructSetData($tPoint, 'Y', 10 + 15)
  24.                         DllCall('user32.dll', 'bool', 'ClientToScreen', 'hwnd', $hGUI, 'struct*', $tPoint)
  25.                         _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI, DllStructGetData($tPoint, 1), DllStructGetData($tPoint, 2))
  26.                         _GUICtrlMenu_DestroyMenu($hMenu)
  27.         EndSwitch
  28. WEnd
复制代码
发表于 2018-10-3 10:53:01 | 显示全部楼层
本帖最后由 afan 于 2018-10-3 11:22 编辑
heroxianf 发表于 2018-10-3 10:08
嗯  两个方法我都实现了,现在看看哪个用的比较方便,点击率少一点最好。

肯定菜单方式要方便N多了。悬停即展出、切换,就是菜单最大的优势。
如有需要菜单可以创建“无数级”子菜单,要用列表实现那就见鬼了,就算将承载列表的窗口加横向滚动条操作也费老劲。
网页估计是不好实现这种菜单方式才使用的列表方式。当然,即使用列表同样可以做到菜单的悬停方式,但这是另外一说了,如无必要,孰会吃撑。


 楼主| 发表于 2018-10-3 12:28:00 | 显示全部楼层
afan 发表于 2018-10-3 10:53
肯定菜单方式要方便N多了。悬停即展出、切换,就是菜单最大的优势。
如有需要菜单可以创建“无数级”子 ...

嗯,  慢慢研究一下,目前业务菜单单列有1600+项,4层循环要耗0.5秒的样子,  不过可以接受。  之前是读取控件文字来判断INI所选的数据,才会那样设计格式,现在使用下拉菜单貌似就没必要了。  多谢A大指点。
发表于 2018-10-3 22:06:07 | 显示全部楼层
heroxianf 发表于 2018-10-3 12:28
嗯,  慢慢研究一下,目前业务菜单单列有1600+项,4层循环要耗0.5秒的样子,  不过可以接受。  之前是读 ...

数据这么多有点难,要想别的办法

Func _CreateMenu()
        Local $hMenu = _GUICtrlMenu_CreatePopup()
        Local $hMenuC, $hMenuB
        For $ii = 1 To 3
                $hMenuB = _GUICtrlMenu_CreateMenu()
                For $jj = 1 To 3
                        $hMenuC = _GUICtrlMenu_CreateMenu()
                        ;For $ji = 1 To 4
                                _GUICtrlMenu_AddMenuItem($hMenuC, '子菜单A ' ,  $e_idOpen)
                                _GUICtrlMenu_AddMenuItem($hMenuC, '保存子菜单 ' ,  $e_idOpen1)
                                _GUICtrlMenu_AddMenuItem($hMenuC, '信息子菜单 ' ,  $e_idOpen2)
                            _GUICtrlMenu_AddMenuItem($hMenuC, '打开子菜单 ' ,  $e_idOpen3)
                        ;Next
                        _GUICtrlMenu_AddMenuItem($hMenuB, '子菜单 ' & $jj, 0, $hMenuC)
                Next
                _GUICtrlMenu_AddMenuItem($hMenu, '主菜单 ' & $ii, 0, $hMenuB)
        Next
        GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
        Local $tPoint = DllStructCreate('int X;int Y')
        DllStructSetData($tPoint, 'X', 10)
        DllStructSetData($tPoint, 'Y', 10 + 15)
        DllCall('user32.dll', 'bool', 'ClientToScreen', 'hwnd', $hGUI, 'struct*', $tPoint)
        _GUICtrlMenu_TrackPopupMenu($hMenu, $hGUI, DllStructGetData($tPoint, 1), DllStructGetData($tPoint, 2))
        _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc   ;==>_CreateMenu
; 处理 WM_COMMAND 消息
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Local $sRead, $sRead1, $sRead2, $sRead3
        Switch $wParam
                Case $e_idOpen;[1]
                        $sRead = "菜单1/菜单2/菜单3/菜单4";你点击了 [打开]
                Case $e_idOpen1;[2]
                        $sRead3 = " 保存"
                Case $e_idOpen2;[3]
                        $sRead2 = "信息"
                Case $e_idOpen3;[4]
                        $sRead1 = "打开"
        EndSwitch
        GUICtrlSetData($showLabel, $sRead1 & $sRead2 & $sRead3 & $sRead)
EndFunc   ;==>WM_COMMAND

发表于 2018-10-3 22:26:36 | 显示全部楼层
1600+项 创建速度0.5秒再正常不过了…… 而且这只是创建菜单,一般程序启动时搞一次即可(不要销毁),又不是每次弹出菜单前都要创建一次,5秒都无所谓。
 楼主| 发表于 2018-10-4 01:54:19 | 显示全部楼层
afan 发表于 2018-10-3 22:26
1600+项 创建速度0.5秒再正常不过了…… 而且这只是创建菜单,一般程序启动时搞一次即可(不要销毁),又不是 ...

正在想怎么改代码, 程序启动就加载菜单,就不用每次点击都重新创建一次。这次又学到很多
发表于 2018-10-4 12:29:42 | 显示全部楼层
下面这张图看你参考一下:


本帖子中包含更多资源

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

x
 楼主| 发表于 2018-10-4 12:44:46 | 显示全部楼层
chzj589 发表于 2018-10-4 12:29
下面这张图看你参考一下:

3Q, 等放假再研究一下
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2018-12-16 19:32 , Processed in 0.099181 second(s), 12 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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