Что нового

Как при клике в меню узнать название пункта

pvnn

Осваивающий
Сообщения
305
Репутация
32
AutoIt программа, пункты меню создаются автоматически из Ini-файла, поэтому я не знаю их ID.
Как при клике на пункт меню узнать название этого пункта и название самого меню.
Например, при выборе: Файл->подменю1 мне нужно узнать что был выбран "Файл" и "подменю1"
Код:
; Библиотеки
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

; Настройки
$KatDef=@ScriptDir
$IniConfig=$KatDef&'\config.ini'

; Для примера
$hFile=FileOpen('config.ini',2)
FileWriteLine($hFile,'[Файл]')
FileWriteLine($hFile,'подменю1=команда1')
FileWriteLine($hFile,'подменю2=команда2')
FileWriteLine($hFile,'[Правка]')
FileWriteLine($hFile,'подменю1=команда3')
FileClose($hFile)

; Чтение Ini
If not FileExists($IniConfig) Then Exit MsgBox(16,'Внимание','Файл настроек не найден'&@CRLF&$IniConfig)
$aAllSection=IniReadSectionNames($IniConfig)
If @error Then Exit MsgBox(16,'Внимание','Файл настроек пуст'&@CRLF&$IniConfig)

; GUI
$Form1 = GUICreate("form1", 735, 546, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME))
; Строим пункты меню
For $i=1 To $aAllSection[0]
	$Menu = GUICtrlCreateMenu('&'&$aAllSection[$i])
	; Строим Подменю
	$aSection=IniReadSection($IniConfig,$aAllSection[$i])
	If @error Then ContinueLoop
	For $j=1 To $aSection[0][0]
		$SubMenu = GUICtrlCreateMenuItem($aSection[$j][0], $Menu)
	Next
Next
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Текст выбранного подпункта меню можно так:
Код:
If not FileExists($IniConfig) Then Exit MsgBox(16,'Внимание','Файл настроек не найден'&@CRLF&$IniConfig)
$aAllSection=IniReadSectionNames($IniConfig)
If @error Then Exit MsgBox(16,'Внимание','Файл настроек пуст'&@CRLF&$IniConfig)

; GUI
$Form1 = GUICreate("form1", 735, 546, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME))
; Строим пункты меню
Dim $SubMenu[0]
$n=0
For $i=1 To $aAllSection[0]
    $Menu = GUICtrlCreateMenu('&'&$aAllSection[$i])
    ; Строим Подменю
    $aSection=IniReadSection($IniConfig,$aAllSection[$i])
    If @error Then ContinueLoop
    For $j=1 To $aSection[0][0]
		$n+=1
		ReDim $SubMenu[$n]
        $SubMenu[$n-1] = GUICtrlCreateMenuItem($aSection[$j][0], $Menu)
    Next
Next
GUISetState(@SW_SHOW)
_ArrayDisplay($Menu)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		Case $SubMenu[0] To $SubMenu[UBound($SubMenu)-1]
			MsgBox(0,"Текст пункта меню",_GUICtrlMenu_GetItemText(_GUICtrlMenu_GetMenu($Form1), $nMsg , False))
	EndSwitch

WEnd
 
A

Alofa

Гость
ra4o сказал(а):
Текст выбранного подпункта меню можно так...
Или так:
Код:
#include <GUIConstantsEx.au3>

Local $Form1, $Menu, $iSM, $SubMenuStart, $SubMenuEnd
$Form1 = GUICreate("form1", 205, 106)
$Menu = GUICtrlCreateMenu('Меню')

For $i = 1 To Random(1, 20, 1) ; Для примера
	$iSM = GUICtrlCreateMenuItem('подменю ' & $i, $Menu)
	If Not $iSM Then ContinueLoop
	If $SubMenuStart Then
		$SubMenuEnd = $iSM
	Else
		$SubMenuStart = $iSM
	EndIf
Next
If Not $SubMenuEnd Then $SubMenuEnd = $iSM
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $SubMenuStart To $SubMenuEnd
			MsgBox(262144, Default, 'Выбран пункт:  ' & GUICtrlRead($nMsg, 1))
	EndSwitch
WEnd
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Текст выбранного подпункта меню можно так
А как определить текст самого меню? Как узнать что был выбран именно пункт меню Файл?
Мне нужно знать и Пункт меню и текст подменю
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
pvnn
А как определить текст самого меню?
С какой целью вам это нужно? Концепция меню, как бы, не предполагает наличие одинаковых подпунктов. А если они одинаковые, то и команду выполняют одну и ту же. Имя есть, по имени нашли команду, выполнили.
Но если очень нужно одинаковые пункты с разными командами, то можно создать двумерный массив с идентификатором пункта подменю и выполняемой им командой. По идентификатору найти команду и выполнить.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
С какой целью вам это нужно? Концепция меню, как бы, не предполагает наличие одинаковых подпунктов
InnI, а у меня и не будет одинаковых подпунктов, пример быстро накидал, не думал, что он введет в заблуждение.

Концепция такая:
-Меню создается из ini-файла
-Секции (section) ini-файла это Пункты меню, например [Файл], [Правка] итд...
-Ключи (key) ini-файла - это Подпункты меню
-Значения (value) ini-файла - это Команды, которые будут выполнены
При выборе подпункта какого-либо пункта меню я хотел узнать название пункта меню (section), и название подпункта (key), далее по этим данным я в ini-файле нахожу команду и выполняю ее.
Если мне нужно расширить меню, то я просто изменяю ini-файл и добавляю команды.

Как узнать название подпунктов выше мне уже написали.
И я так понимаю, что названия пунктов меню узнать никак нельзя?
Если это так, то тогда конечно двумерный массив...
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
pvnn
названия пунктов меню узнать никак нельзя?
Можно попробовать такой "велосипед"... вроде работает
Код:
#include <GuiMenu.au3>

...

Global $sMenuItem = ""
Global $hMenu = _GUICtrlMenu_GetMenu($Form1)
Global $iCount = _GUICtrlMenu_GetItemCount($hMenu)

GUIRegisterMsg($WM_UNINITMENUPOPUP, "WM_UNINITMENUPOPUP")

...

Func WM_UNINITMENUPOPUP()
  For $i = 0 To $iCount - 1
    If _GUICtrlMenu_GetItemHighlighted($hMenu, $i) Then
      $sMenuItem = _GUICtrlMenu_GetItemText($hMenu, $i)
      ExitLoop
    EndIf
  Next
  If $i = $iCount Then $sMenuItem = ""
  ; ConsoleWrite($sMenuItem & @CRLF)
  Return $GUI_RUNDEFMSG
EndFunc
 
Верх