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, 等放假再研究一下