heroxianf 发表于 2018-10-3 09:23:24

afan 发表于 2018-10-2 10:49
说到点子上了…而且这个设计非常重要

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

A大,这个下拉菜单是点击后实时创建,我这里创建下来有一点延迟,鼠标一拖动,弹出的菜单会移动,能不能把下拉菜单固定在控件处弹出?

顽固不化 发表于 2018-10-3 09:58:08

可以考虑用三个并排的List控件来模拟

heroxianf 发表于 2018-10-3 10:08:25

顽固不化 发表于 2018-10-3 09:58
可以考虑用三个并排的List控件来模拟

嗯两个方法我都实现了,现在看看哪个用的比较方便,点击率少一点最好。

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

afan 发表于 2018-10-3 10:53:01

本帖最后由 afan 于 2018-10-3 11:22 编辑

heroxianf 发表于 2018-10-3 10:08
嗯两个方法我都实现了,现在看看哪个用的比较方便,点击率少一点最好。
肯定菜单方式要方便N多了。悬停即展出、切换,就是菜单最大的优势。
如有需要菜单可以创建“无数级”子菜单,要用列表实现那就见鬼了,就算将承载列表的窗口加横向滚动条操作也费老劲。
网页估计是不好实现这种菜单方式才使用的列表方式。当然,即使用列表同样可以做到菜单的悬停方式,但这是另外一说了,如无必要,孰会吃撑。


heroxianf 发表于 2018-10-3 12:28:00

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

嗯,慢慢研究一下,目前业务菜单单列有1600+项,4层循环要耗0.5秒的样子,不过可以接受。之前是读取控件文字来判断INI所选的数据,才会那样设计格式,现在使用下拉菜单貌似就没必要了。多谢A大指点。

chzj589 发表于 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;
                        $sRead = "菜单1/菜单2/菜单3/菜单4";你点击了 [打开]
                Case $e_idOpen1;
                        $sRead3 = " 保存"
                Case $e_idOpen2;
                        $sRead2 = "信息"
                Case $e_idOpen3;
                        $sRead1 = "打开"
      EndSwitch
      GUICtrlSetData($showLabel, $sRead1 & $sRead2 & $sRead3 & $sRead)
EndFunc   ;==>WM_COMMAND

afan 发表于 2018-10-3 22:26:36

1600+项 创建速度0.5秒再正常不过了…… 而且这只是创建菜单,一般程序启动时搞一次即可(不要销毁),又不是每次弹出菜单前都要创建一次,5秒都无所谓。

heroxianf 发表于 2018-10-4 01:54:19

afan 发表于 2018-10-3 22:26
1600+项 创建速度0.5秒再正常不过了…… 而且这只是创建菜单,一般程序启动时搞一次即可(不要销毁),又不是 ...

正在想怎么改代码, 程序启动就加载菜单,就不用每次点击都重新创建一次。这次又学到很多{:face (55):}

chzj589 发表于 2018-10-4 12:29:42

下面这张图看你参考一下:


heroxianf 发表于 2018-10-4 12:44:46

chzj589 发表于 2018-10-4 12:29
下面这张图看你参考一下:

3Q, 等放假再研究一下
页: 1 2 [3]
查看完整版本: 想模仿JS的一个联动菜单,请指点一下[已解决]