找回密码
 加入
搜索
楼主: heroxianf

[网络通信] 想模仿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大,这个下拉菜单是点击后实时创建,我这里创建下来有一点延迟,鼠标一拖动,弹出的菜单会移动,能不能 ...
#include <GuiMenu.au3>

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

While 1
        Switch GUIGetMsg()
                Case -3
                        Exit
                Case 3
                        Local $hMenu = _GUICtrlMenu_CreatePopup()
                        Local $hMenuC
                        For $ii = 1 To 5
                                $hMenuC = _GUICtrlMenu_CreateMenu()
                                For $jj = 1 To 3
                                        _GUICtrlMenu_AddMenuItem($hMenuC, '子菜单 ' & $jj)
                                Next
                                _GUICtrlMenu_AddMenuItem($hMenu, '主菜单 ' & $ii, 0, $hMenuC)
                        Next
                        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)
        EndSwitch
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 | 显示全部楼层
下面这张图看你参考一下:


本帖子中包含更多资源

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

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

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

本版积分规则

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

GMT+8, 2024-5-21 08:42 , Processed in 0.072148 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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