Что нового

Создание GUI с вызовом событий по условию

dr.room

Новичок
Сообщения
283
Репутация
0
Версия AutoIt:
AutoIt v3.3.14.2
Описание:
Всем привет
Как нужно к нажатию по кнопке выпадающего списка (в данном случае GUICtrlCreateContextMenu: имхо по человечески выглядит ) привязать такое условие для скрипта:
- запустить выполнения скрипта от самого начала и до указанного условия
- остановить и вывести сообщение: при обнаружении указанного условия: к примеру - определенной функции, точнее её объявления. Т.е. выполнить заданный диапазон действий не более. Т.е. наложить определённые ограничения на выполнение: не всех функций в скрипте а только части из них.
В самом GUI - нужна только 1 кнопка с выпадающим списком условий.
Примечания:
Пример с GUICtrlCreateContextMenu (тут правда 2 кнопки) взят из справки
и пока что - нет вызываемых событий (кроме выхода из GUI)
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

; Opt('MustDeclareVars', 1) ; принуждает объявлять все переменные


Example2()


Func Example2()
	Local $hGui, $OptionsBtn, $OptionsDummy, $OptionsContext, $OptionsCommon, $OptionsFile, $msg
	Local $OptionsExit, $HelpBtn, $HelpDummy, $HelpContext, $HelpWWW, $HelpAbout
	$hGui = GUICreate("Мой GUI", 170, 40)

	$OptionsBtn = GUICtrlCreateButton("&Условия", 10, 10, 70, 20, $BS_FLAT)

	; Сначала создан элемент - пустышка (Dummy) и контекстное меню для него, которое будет пристроено к кнопке "Опции"
	$OptionsDummy = GUICtrlCreateDummy()
	$OptionsContext = GUICtrlCreateContextMenu($OptionsDummy)
	$OptionsCommon = GUICtrlCreateMenuItem("Начать выполнения скрипта - до  обнаружения функции message3()", $OptionsContext)
	$OptionsFile = GUICtrlCreateMenuItem("Выполнять скрипт - до функции message4()", $OptionsContext)
	GUICtrlCreateMenuItem("", $OptionsContext)
	$OptionsExit = GUICtrlCreateMenuItem("Выход", $OptionsContext)

	$HelpBtn = GUICtrlCreateButton("", 90, 10, 70, 20, $BS_FLAT)

	; Создан элемент - пустышка и контекстное меню, которое будет пристроено к кнопке "Справка"
	$HelpDummy = GUICtrlCreateDummy()
	$HelpContext = GUICtrlCreateContextMenu($HelpDummy)
	$HelpWWW = GUICtrlCreateMenuItem("Веб-сайт", $HelpContext)
	GUICtrlCreateMenuItem("", $HelpContext)
	$HelpAbout = GUICtrlCreateMenuItem("О примере...", $HelpContext)

	GUISetState()

	While 1
		$msg = GUIGetMsg()

		Switch $msg
			Case $OptionsExit, $GUI_EVENT_CLOSE
				ExitLoop

			Case $OptionsBtn
				ShowMenu($hGui, $msg, $OptionsContext)

			Case $HelpBtn
				ShowMenu($hGui, $msg, $HelpContext)

			Case $HelpAbout
				MsgBox(4160, "О примере...", "Удобное меню выбора действий")
		EndSwitch
	WEnd
	GUIDelete()
EndFunc

; Отображает меню в данном GUI окне, которое принадлежит данному элементу в GUI
Func ShowMenu($hWnd, $CtrlID, $nContextID)
	Local $arPos, $x, $y
	Local $hMenu = GUICtrlGetHandle($nContextID)

	$arPos = ControlGetPos($hWnd, "", $CtrlID)

	$x = $arPos[0]
	$y = $arPos[1] + $arPos[3]

	ClientToScreen($hWnd, $x, $y)
	TrackPopupMenu($hWnd, $hMenu, $x, $y)
EndFunc

; Конвертирует клиентские координаты (GUI) в абсолютные координаты экрана (desktop)
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
	Local $stPoint = DllStructCreate("int;int")

	DllStructSetData($stPoint, 1, $x)
	DllStructSetData($stPoint, 2, $y)

	; См. также _WinAPI_ClientToScreen
	DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))

	$x = DllStructGetData($stPoint, 1)
	$y = DllStructGetData($stPoint, 2)
	; обнулять структуру не обязательно, так как она локальна
	$stPoint = 0
EndFunc

; Показать контекстное меню (hMenu) принадлежащее GUI окну (hWnd) в указанных координатах (x, y)
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
	; См. также _GUICtrlMenu_TrackPopupMenu
	DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc


#CS
Пример набора функция в скрипте: пока что  с кнопками GUICtrlCreateContextMenu события не связанны
;   потому все функции  - выполняються подряд и без ограничений.
 #CE

message1()  ; первая функция в  скрипте
Sleep(1000)
message2()  ; вторая функция в  скрипте
Sleep(1000)
message3() ; третья функция в  скрипте...
Sleep(1000)
message4()
Sleep(1000)
message5()

Func message1()
	Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(262208,"Окно 1","Это  - сообщение №1",2)
Select
   Case $iMsgBoxAnswer = -1 ;Timeout

   Case Else                ;OK

EndSelect
	EndFunc

Func message2()
	Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(262208,"Окно 2","Это  - сообщение №2",2)
Select
   Case $iMsgBoxAnswer = -1 ;Timeout

   Case Else                ;OK

EndSelect
	EndFunc

Func message3()
	Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(262208,"Окно 3","Это  - сообщение №3",2)
Select
   Case $iMsgBoxAnswer = -1 ;Timeout

   Case Else                ;OK

EndSelect
	EndFunc

Func message4()
	Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(262208,"Окно 4","Это  - сообщение №4",2)
Select
   Case $iMsgBoxAnswer = -1 ;Timeout

   Case Else                ;OK

EndSelect
	EndFunc

Func message5()
	Dim $iMsgBoxAnswer
$iMsgBoxAnswer = MsgBox(262208,"Окно 5","Это  - сообщение №5",2)
Select
   Case $iMsgBoxAnswer = -1 ;Timeout

   Case Else                ;OK

EndSelect
	EndFunc

Спасибо
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Вот событие, где $HelpBtn идентификатор события, а снизу список выполняемых (диапазон в твоей лексике) команд.
Код:
Case $HelpBtn
                ShowMenu($hGui, $msg, $HelpContext)

Конманды выполняются по очереди друг за другом (до следующего Case). Впиши свои команды, впиши условие, вот и будет тебе условие.
(тут правда 2 кнопки)
Сотри лишние кнопки и их события. Стёр/запустил, стёр/запустил, проверил что всё работает, в итоге поймёшь за что отвечают строки.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
dr.room
Функции, а тем более их определения, не обнаруживаются. Они (функции) либо вызываются для выполнения, либо нет. При выборе пункта меню просто вызывайте набор нужных в данный момент функций и всё
Код:
...
      Case $HelpAbout
        MsgBox(4160, "О примере...", "Удобное меню выбора действий")

      Case $OptionsCommon ; <= выбор пункта меню "Начать выполнения скрипта - до..."
        message1()
        Sleep(1000)
        message2()

      Case $OptionsFile ; <= выбор пункта меню "Выполнять скрипт - до..."
        message1()
        Sleep(1000)
        message2()
        Sleep(1000)
        message3()
    EndSwitch
  WEnd
  GUIDelete()
EndFunc   ;==>Example2
...
 
Автор
D

dr.room

Новичок
Сообщения
283
Репутация
0
Всем спасибо за помощь
Похоже - вопрос решен.
 
Верх