Что нового

Как автоматически создать контекстное меню из двумерного массива?

Suppir

Продвинутый
Сообщения
967
Репутация
62
У меня есть ini со следующей записью:

[Быстрые ссылки]
Налоговый кодекс=123
Гражданский кодекс=234
Уголовный кодекс=456


Я хочу в скрипте при нажатии хоткея создавать контекстное меню (как от правого клика мышкой). При этом элементами этого меню должны браться из ini-файла.

Вот фрагменты кода:

Код:
Func _LinkMenu()
	Local $MousePos, $ContextMenu, $i


	$MousePos = MouseGetPos()
	# создаем гуи для контекстного меню
	$Form1 = GUICreate("", 1, 1, $MousePos[0], $MousePos[1], $GUI_SS_DEFAULT_GUI - $WS_CAPTION)
	# создаем меню
	$ContextMenu = GUICtrlCreateContextMenu()

	$Ini = IniReadSection("файл.ini", "Быстрые ссылки")
	For $i = 1 To $ini[0][0]
		# создаем элементы контекстного меню из данных ini-файла
		$MenuItem[$i] = GUICtrlCreateMenuItem ($ini[$i][0], $ContextMenu)
	Next

	GUISetState(@SW_SHOW)
	MouseClick("secondary")
	while 1
		$msg = GUIGetMsg()
		# здесь нужно условие "если кликнут "MenuItem[$такой-то], послать функции link() переменную $ini[$такой-то][1]
	WEnd
EndFunc


Т.е. необходимо создать контекстное меню, где будет написано:
Налоговый кодекс
Гражданский кодекс
Уголовный кодекс

Если пользователь выбирает Налоговый кодекс, то послать функции link() переменную 123.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIMenu.au3>
#include <Misc.au3>
#include <Timers.au3>

_Link_Menu()

Func _Link_Menu()
	Local $hDlg, $cDummy, $nContextMenu, $hContextMenu, $nHide_MItem, $nExit_MItem, $hTimer, $aMousePos, $nResult
	Local $aIni, $aMenuItems
	
	$hDlg = GUICreate("", 1, 1, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW); Create our temporary GUI
	
	$cDummy = GUICtrlCreateDummy(); Create a dummy control to hang a context menu on
	
	$nContextMenu = GUICtrlCreateContextMenu($cDummy); Create the context menu
	$hContextMenu = GUICtrlGetHandle($nContextMenu)
	
	$aIni = IniReadSection("файл.ini", "Быстрые ссылки")
	Dim $aMenuItems[$aIni[0][0]+1]
	$aMenuItems[0] = $aIni[0][0]
	
    For $i = 1 To $aIni[0][0]
		$aMenuItems[$i] = GUICtrlCreateMenuItem($aIni[$i][0], $nContextMenu)
    Next
	
	GUICtrlCreateMenuItem("", $nContextMenu)
	$nExit_MItem = GUICtrlCreateMenuItem("Exit", $nContextMenu)
	
	GUISetState(@SW_SHOW, $hDlg)
	
	$aMousePos = MouseGetPos()
	$nResult = _GUICtrlMenu_TrackPopupMenu($hContextMenu, $hDlg, $aMousePos[0] - 27, $aMousePos[1] - 12, 1, 1, 2)
	
	Switch $nResult
		Case $nExit_MItem
			Exit
		Case $aMenuItems[1] To $aMenuItems[$aMenuItems[0]]
			For $i = 1 To $aMenuItems[0]
				If $nResult = $aMenuItems[$i] Then _Link_Event($aIni[$i][1])
			Next
	EndSwitch
	
	Exit
EndFunc

Func _Link_Event($nVar)
	MsgBox(64, 'Title', $nVar)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ого, все оказалось немного сложнее, чем я думал. Функцию _GUICtrlMenu_TrackPopupMenu вообще первый раз вижу.

CreatoR, а возможно ли со стандартным GUICtrlCreateContextMenu сделать такую штуку:
1) если на пункт меню нажать левой кнопкой мыши, то $aIni[$i][1] передается в функцию link()
2) а если нажать правой кнопкой мыши, то передается в функцию another()

Или здесь нужно полностью свое контекстное меню делать?


Добавлено:
Сообщение автоматически объединено:

В функции _GUICtrlMenu_TrackPopupMenu есть опция $iButtons, которая позволяет нажимать элементы меню и левой и правой кнопкой, но это немножко не то.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Suppir [?]
возможно ли со стандартным GUICtrlCreateContextMenu сделать такую штуку
Можно:

Код:
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIMenu.au3>
#include <Misc.au3>
#include <Timers.au3>

Global $sCall_FuncName = "_Link_Event"

_Link_Menu()

Func _Link_Menu()
	Local $hDlg, $cDummy, $nContextMenu, $hContextMenu, $nHide_MItem, $nExit_MItem, $hTimer, $aMousePos, $nResult
	Local $aIni, $aMenuItems
	
	$hDlg = GUICreate("", 1, 1, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW); Create our temporary GUI
	
	$cDummy = GUICtrlCreateDummy(); Create a dummy control to hang a context menu on
	
	$nContextMenu = GUICtrlCreateContextMenu($cDummy); Create the context menu
	$hContextMenu = GUICtrlGetHandle($nContextMenu)
	
	$aIni = IniReadSection("файл.ini", "Быстрые ссылки")
	Dim $aMenuItems[$aIni[0][0]+1]
	$aMenuItems[0] = $aIni[0][0]
	
    For $i = 1 To $aIni[0][0]
		$aMenuItems[$i] = GUICtrlCreateMenuItem($aIni[$i][0], $nContextMenu)
    Next
	
	GUICtrlCreateMenuItem("", $nContextMenu)
	GUICtrlCreateMenuItem("Exit", $nContextMenu)
	
	GUISetState(@SW_SHOW, $hDlg)
	
	$aMousePos = MouseGetPos()
	$hTimer = _Timer_SetTimer($hDlg, 100, "_CheckPressed_Proc")
	$nResult = _GUICtrlMenu_TrackPopupMenu($hContextMenu, $hDlg, $aMousePos[0] - 27, $aMousePos[1] - 12, 1, 1, 2, 1)
	_Timer_KillTimer($hDlg, $hTimer)
	
	Switch $nResult
		Case $aMenuItems[1] To $aMenuItems[$aMenuItems[0]]
			For $i = 1 To $aMenuItems[0]
				If $nResult = $aMenuItems[$i] Then
					Call($sCall_FuncName, $aIni[$i][1])
					ExitLoop
				EndIf
			Next
	EndSwitch
	
	Exit
EndFunc

Func _CheckPressed_Proc($hWnd, $Msg, $iIDTimer, $dwTime)
	If _IsPressed(02) Then $sCall_FuncName = "_Other_Event"
EndFunc

Func _Link_Event($nVar)
	MsgBox(64, 'Link', $nVar)
EndFunc

Func _Other_Event($nVar)
	MsgBox(64, 'Other', $nVar)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR, ты просто AutoIt Must'ер! :smile:
 
Верх