Что нового

GUIDynamicMenu UDF

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AutoIt: 3.3.x.x
Версия: 0.3

Категория: Элементы GUI, Разное

Описание:
Библиотека предназначена для создания динамического меню из ini-файл.

Структура/синтаксис меню ini-файла:
INI:
[MENU]
Item, "ITEM_NAME" = DISABLED
--- = 0
Item, "ITEM_NAME" = COMMAND, "PATH/URL", "ARGUMENTS", "ICON_FILE", ICON_ID, "HOTKEY"
Submenu, "MENU_NAME" = SECTION_NAME, "EXTERNAL_INI_PATH", "ICON_FILE", ICON_ID
Include = SECTION_NAME, "EXTERNAL_INI_PATH"

Пояснения:
[MENU] --> Имя секции:
* Следует использовать только ansi символы.

Item, ... --> Неактивный пункт меню:
"ITEM_NAME" - Отображаемый текст для неактивного пункта меню.
DISABLED - Сообщает меню что следует деактивировать пункт меню, следует использовать только эту инструкцию.

--- = ... --> Пункт разделитель:
* Следует использовать 3 дефиса для указания разделителя в меню, всё что после знака "=" будет проигнорировано.

Item, ... --> Пункт меню:
"ITEM_NAME" - Отображаемый текст для пункта меню.
COMMAND - [опционально] Команда для выполнения при обращений к пункту меню, поддерживаемые команды:
Execute = Запуск указанного приложения или файла (PATH/URL).
Execute Line = Запуск одной AutoIt строки.
Go to Page = Opens specified URL (PATH/URL) in default browser.
Send = Отправка клавиатурных нажатий (может быть использовано для отправки системных г. клавиш).
Exit = Программный выход из приложения.
"PATH/URL" - Путь к файлу или URL для использования в указанной команде (COMMAND).
"ARGUMENTS" - Аргументы для исполняемого пути ("PATH/URL") - только для команды <Execute>.
"ICON_FILE" - [опционально] Файл иконки для использования в пункте меню.
ICON_ID - [опционально] Идентификатор (имя) иконки в указанном файле иконки ("ICON_FILE").
"HOTKEY" - [опционально] Г. клавиша назначаемая пункту меню (в формате "Ctrl+Shift+Q").
"HOTKEY_IS_GLOBAL" - [опционально] Определяет видимость г. клавиш.
0 использовать только для текущего окна.
1 использовать глобально.
-1 или опущено - использовать поведение по умолчанию (0 или как установлено в _GUICtrlDynamicMenu_SetHotKeysGlobal)

Submenu, ... --> Пункт подменю (вложенное меню):
"MENU_NAME" - Отображаемый текст для пункта подменю.
SECTION_NAME - Имя секции с которой следует читать пункты подменю.
"EXTERNAL_INI_PATH" - [опционально] Внешний ini-файл с которого будет считываться секция меню.
"ICON_FILE" - [опционально] Файл иконки для использования в пункте подменю.
ICON_ID - [опционально] Идентификатор (имя) иконки в указанном файле иконки ("ICON_FILE").

Include, ... --> Полное вложение меню в текущую позицию:
SECTION_NAME - Имя секции с которой следует читать пункты меню.
"EXTERNAL_INI_PATH" - [опционально] Внешний ini-файл с которого будет считываться секция меню.

Код/Пример:
Код:
#include <GUIDynamicMenu.au3>

Global $sMenu_File = @ScriptDir & '\Menu.ini'

Global $hGUI, $iToggleHKGlobal_CB, $iMenuIconSize_Combo
Global $iAutoItOnWeb_Menu, $iAutoItForums_Bttn, $iOther_Bttn, $iSelfHandled_Bttn
Global $hAutoItOnWeb_Menu, $hAutoItForums_Menu, $hOther_Menu, $hSelfHandled_Menu
Global $hAutoItOnWeb_DM, $hAutoItForums_DM, $hOther_DM, $hSelfHandled_DM

$hGUI = GUICreate('GUIDynamicMenu Example', 360, 200)

$iAutoItOnWeb_Menu = GUICtrlCreateMenu('AutoIt On the web')
$iAutoItForums_Bttn = GUICtrlCreateButton('AutoIt Forums', 20, 20, 80, 30)
$iOther_Bttn = GUICtrlCreateButton('Other', 140, 20, 80, 30)
$iSelfHandled_Bttn = GUICtrlCreateButton('Self handled', 260, 20, 80, 30)

_GUICtrlDynamicMenu_SetHotKeysGlobal(True)
_GUICtrlDynamicMenu_SetIconSize(16)

;Load menus (False to ignore Reload, only load)
_LoadMenu(False)

$iToggleHKGlobal_CB = GUICtrlCreateCheckbox('HotKeys are global (unless set otherwise from the menu item)', 20, 80)
GUICtrlSetState($iToggleHKGlobal_CB, $GUI_CHECKED)

GUICtrlCreateLabel('Menu icon size:', 20, 123)
$iMenuIconSize_Combo = GUICtrlCreateCombo('', 120, 120, 50, 20, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData($iMenuIconSize_Combo, '16|20|24|28|32|36|40|48', '20')

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			GUISetState(@SW_HIDE, $hGUI)
			
			_GUICtrlDynamicMenu_Destroy($hAutoItOnWeb_DM)
			_GUICtrlDynamicMenu_Destroy($hAutoItForums_DM)
			_GUICtrlDynamicMenu_Destroy($hOther_DM)
			_GUICtrlDynamicMenu_Destroy($hSelfHandled_DM)
			
			Exit
		Case $iAutoItForums_Bttn
			_GUICtrlDynamicMenu_Show($hGUI, $hAutoItForums_Menu, $iAutoItForums_Bttn)
		Case $iOther_Bttn
			_GUICtrlDynamicMenu_Show($hGUI, $hOther_Menu, $iOther_Bttn)
		Case $iSelfHandled_Bttn
			$iIdentifier = _GUICtrlDynamicMenu_Show($hGUI, $hSelfHandled_Menu, $iSelfHandled_Bttn, False, 2)
			$aInfo = _GUICtrlDynamicMenu_GetInfo($hSelfHandled_DM, $iIdentifier)
			
			If Not @error Then
				_ArrayDisplay($aInfo)
				ShellExecute($aInfo[$GDM_INFO_PATH])
			EndIf
		Case $iToggleHKGlobal_CB
			_GUICtrlDynamicMenu_SetHotKeysGlobal((GUICtrlRead($iToggleHKGlobal_CB) = $GUI_CHECKED))
		Case $iMenuIconSize_Combo
			_GUICtrlDynamicMenu_SetIconSize(GUICtrlRead($iMenuIconSize_Combo))
			
			GUISetState(@SW_DISABLE, $hGUI)
			
			;Reload the menu to apply changes
			_LoadMenu(True)
			
			GUISetState(@SW_ENABLE, $hGUI)
	EndSwitch
WEnd

Func _LoadMenu($fReload = False)
	If $fReload Then
		;Since it's standard gui menu, should be unloaded only, not destroyed
		_GUICtrlDynamicMenu_UnLoad($hAutoItOnWeb_DM)
		
		_GUICtrlDynamicMenu_Destroy($hAutoItForums_DM)
		_GUICtrlDynamicMenu_Destroy($hOther_DM)
		_GUICtrlDynamicMenu_Destroy($hSelfHandled_DM)
	EndIf
	
	;Since it's standard gui menu, should be created only once
	If Not $hAutoItOnWeb_Menu Then
		$hAutoItOnWeb_Menu = _GUICtrlDynamicMenu_Create($iAutoItOnWeb_Menu)
	EndIf
	
	$hAutoItForums_Menu = _GUICtrlDynamicMenu_Create()
	$hOther_Menu = _GUICtrlDynamicMenu_Create()
	$hSelfHandled_Menu = _GUICtrlDynamicMenu_Create()
	
	$hAutoItOnWeb_DM = _GUICtrlDynamicMenu_Load($hGUI, $hAutoItOnWeb_Menu, $sMenu_File, 'AutoIt On The Web Menu')
	$hAutoItForums_DM = _GUICtrlDynamicMenu_Load($hGUI, $hAutoItForums_Menu, $sMenu_File, 'AutoIt Forums Menu')
	$hOther_DM = _GUICtrlDynamicMenu_Load($hGUI, $hOther_Menu, $sMenu_File, 'Other Menu')
	$hSelfHandled_DM = _GUICtrlDynamicMenu_Load($hGUI, $hSelfHandled_Menu, $sMenu_File, 'Self Handled Menu')
EndFunc
Все файлы для примера имеются в архиве.

Файл: GUIDynamicMenu

Снимок:


История версий:
0.3
* Исправлена проблема с передачей аргументов виде "" при использовании команды Execute.
* Улучшена проверка на ошибки в _GUICtrlDynamicMenu_Destroy.
* Пример изменён.

0.2
+ Добавлена функция _GUICtrlDynamicMenu_SetIconSize для изменения размера иконки у пункта меню (требуется перезагрузка меню для применения изменений, в случае если используется после загрузки меню).
+ Добавлена функция _GUICtrlDynamicMenu_SetHotKeysGlobal для определения того, будут ли горячие клавиши распознаваться глобально или только для текущего GUI (переопределяется пунктом меню, см. описание ini-структуры в заголовке библиотеки или выше в описании).
+ Добавлена пользовательская переменная $GDM_INFO_HK_ISGLOBAL для использования в _GUICtrlDynamicMenu_GetInfo.
* Исправлена проблема с глобальным назначением горячими клавиш, они блокировались для остальных приложений даже если не использовались меню.
* Исправлена проблема с пустым параметром (в кавычках) в пункте меню.
* Исправлена проблема с относительными путями (устанавливался неправильный рабочий каталог).
* Исправлена проблема с командой "Execute Line" в меню.
* Пример изменён.

0.1
Первая публичная версия.

Источник: autoit-script.ru
Автор(ы): G.Sandler (CreatoR)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление...

0.2
+ Добавлена функция _GUICtrlDynamicMenu_SetIconSize для изменения размера иконки у пункта меню (требуется перезагрузка меню для применения изменений, в случае если используется после загрузки меню).
+ Добавлена функция _GUICtrlDynamicMenu_SetHotKeysGlobal для определения того, будут ли горячие клавиши распознаваться глобально или только для текущего GUI (переопределяется пунктом меню, см. описание ini-структуры в заголовке библиотеки).
+ Добавлена пользовательская переменная $GDM_INFO_HK_ISGLOBAL для использования в _GUICtrlDynamicMenu_GetInfo.
* Исправлена проблема с глобальным назначением горячими клавиш, они блокировались для остальных приложений даже если не использовались меню.
* Исправлена проблема с пустым параметром (в кавычках) в пункте меню.
* Исправлена проблема с относительными путями (устанавливался неправильный рабочий каталог).
* Исправлена проблема с командой "Execute Line" в меню.
* Пример изменён.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Обновление:

0.3
* Исправлена проблема с передачей аргументов виде "" при использовании команды Execute.
* Улучшена проверка на ошибки в _GUICtrlDynamicMenu_Destroy.
* Пример изменён.
 
Верх