Что нового

[Окна, Диалоги] Меню без всплывающих элементов (как кнопки)

mef-t

Осваивающий
Сообщения
306
Репутация
30
Доброго времени суток.

Просьба подсказать, можно ли использовать элементы меню, как кнопки.
Т.е. чтобы при нажатии на меню (в примере "Настройка") не открывалось подменю с его элементами, а сразу выполнялось действие, как при нажатии на кнопки.
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

_Initialise()

Func _Initialise()

	; GUI
	Global $GUI = GUICreate("Sample GUI", 410, 400, -1, -1, $WS_OVERLAPPEDWINDOW)

	; MENU
	Global $iMenuSettings = GUICtrlCreateMenu("Настройки")
	Global $iMenuTools = GUICtrlCreateMenu("Инструменты")
	Global $iMenuStatistics = GUICtrlCreateMenu("Статистика")
	Global $iMenuFolder = GUICtrlCreateMenu("Папка бота")
	Global $iMenuInformation = GUICtrlCreateMenu("Информация")

	GUISetState(@SW_SHOW)

	While True
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				ExitLoop

			Case $iMenuSettings
				MsgBox(0, "Справка", "Открытие отдельного CHM")

		EndSwitch
	WEnd

EndFunc   ;==>_Initialise()

Или же это можно реализовать только через кнопки? Но тогда станет куда сложнее для всех остальных элементов меню сделать подменю.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
mef-t [?]
чтобы при нажатии на меню (в примере "Настройка") не открывалось подменю с его элементами, а сразу выполнялось действие, как при нажатии на кнопки
А в справку заглянуть не суждено? (там есть пример).
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Я или неправильно выразился, или просто не вижу очевидного.
Мне нужно, чтобы при нажатии на меню "Настройка" окно выдавало сообщение. Без элементов меню.

В справке не вижу, может сказывается конец дня, а может от рождения тупой.
Если там есть, просьба ткнуть носом.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
mef-t [?]
можно ли использовать элементы меню, как кнопки
Вариант 1
Код:
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

_Initialise()

Func _Initialise()

    ; GUI
    Global $GUI = GUICreate("Sample GUI", 410, 400, -1, -1, $WS_OVERLAPPEDWINDOW)

    ; MENU
    $mnu = GUICtrlCreateMenu("")
    Global $iMenuSettings = GUICtrlCreateMenuItem("Настройки", -1)
    Global $iMenuTools = GUICtrlCreateMenuItem("Инструменты", -1)
    Global $iMenuStatistics = GUICtrlCreateMenuItem("Статистика", -1)
    Global $iMenuFolder = GUICtrlCreateMenuItem("Папка бота", -1)
    Global $iMenuInformation = GUICtrlCreateMenuItem("Информация", -1)
    GUICtrlDelete($mnu)

    GUISetState(@SW_SHOW)

    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

            Case $iMenuSettings
                MsgBox(0, "Справка", "Открытие отдельного CHM")

        EndSwitch
    WEnd

EndFunc   ;==>_Initialise()
Вариант 2
Код:
#include <GuiMenu.au3>
#include <WindowsConstants.au3>

Enum $iMenuSettings = 1000, $iMenuTools, $iMenuStatistics

$GUI = GUICreate("Sample GUI", 430, 400)
$mnu = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_AddMenuItem($mnu, "Настройки", $iMenuSettings)
_GUICtrlMenu_AddMenuItem($mnu, "Инструменты", $iMenuTools)
_GUICtrlMenu_AddMenuItem($mnu, "Статистика", $iMenuStatistics)
_GUICtrlMenu_SetMenu($GUI, $mnu)
GUISetState()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

Do
Until GUIGetMsg() = -3

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
  Switch BitAND($wParam, 0x0000FFFF)
    Case $iMenuSettings
      MsgBox(0, "$iMenuSettings", "Настройки", 0, $GUI)
    Case $iMenuTools
      MsgBox(0, "$iMenuTools", "Инструменты", 0, $GUI)
    Case $iMenuStatistics
      MsgBox(0, "$iMenuStatistics", "Статистика", 0, $GUI)
  EndSwitch
  Return "GUI_RUNDEFMSG"
EndFunc
 

CreatoR

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

$hGUI = GUICreate("_GUICtrlCreateMenuItemEx", 200, 100)
$iMenuItem = _GUICtrlCreateMenuItemEx("Settings", -1)
;Это не сработает если предварительно не создать меню с подпунктами (баг в 3.2.1.2 и выше)
;$iMenuItem = GUICtrlCreateMenuItem("Settings", -1)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $iMenuItem
            MsgBox(0, "", "Settings Button Pressed", 0, $hGUI)
    EndSwitch
WEnd

Func _GUICtrlCreateMenuItemEx($sText, $iMenuID, $iMenuEntry = -1, $iMenuRadioItem = 0)
	Local $iDummyMenu, $iDummyMenuItem, $iMenuItem
	
	If @AutoItVersion >= '3.2.1.2' Then
		$iDummyMenu = GUICtrlCreateMenu("")
		$iDummyMenuItem = GUICtrlCreateMenuItem("", $iDummyMenu)
		$iMenuItem = GUICtrlCreateMenuItem($sText, $iMenuID, $iMenuEntry, $iMenuRadioItem)
		GUICtrlDelete($iDummyMenu)
		GUICtrlDelete($iDummyMenuItem)
	Else
		$iMenuItem = GUICtrlCreateMenuItem($sText, $iMenuID, $iMenuEntry, $iMenuRadioItem)
	EndIf
	
	Return $iMenuItem
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
CreatoR [?]
баг в 3.2.1.2 и выше
А я думал - это фича такая, что подпункты без главного меню не создаются...
Поправил "Вариант 1": удалил ненужное меню.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
А я думал - это фича такая, что подпункты без главного меню не создаются...
Насколько я понимаю это как раз таки бага, о которой писали и на оф. форуме. Раньше кстати можно было создавать такие кнопки без всяких Dummy-меню.

P.S
В моём коде присутствует и создание подпункта в Dummy-меню, если память не изменяет (код писался довольно таки давно), то в одной из промежуточных версии (> 3.2.1.2) без этого пункта меню-кнопки не создавались.
 
Верх