Что нового

[Элементы GUI] GUIOnEventMode + SetParent не работаю кнопки

angro

Новичок
Сообщения
31
Репутация
1
Если исключить из кода _WinAPI_SetParent кнопки начинают работать. Тему видел https://autoit-script.ru/index.php?topic=2251.msg16346#msg16346, но не смог разобраться почему там работает а у меня нет.

Код:
#NoTrayIcon
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiConstantsEx.au3>

Opt('GUIOnEventMode', 1)

$GuiSettings = GUICreate('Lang1', 500, 500, Default, Default, $WS_THICKFRAME)

$GuiSettingsLeft = GUICreate('', 0, 0, 0, 0, $WS_POPUPWINDOW)
$987456 = GUICtrlCreateLabel('PanelLeft', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))

$GuiSettingsRight = GUICreate('', 0, 0, 0, 0, $WS_POPUPWINDOW)
$12431 = GUICtrlCreateLabel('PanelRight', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))

_WinAPI_SetParent($GuiSettingsLeft,  $GuiSettings)
_WinAPI_SetParent($GuiSettingsRight, $GuiSettings)

_WinAPI_SetWindowPos($GuiSettingsLeft,  $HWND_BOTTOM, 1, 1, 100, WinGetClientSize($GuiSettings)[1] - 2, $SWP_SHOWWINDOW)
_WinAPI_SetWindowPos($GuiSettingsRight, $HWND_BOTTOM, WinGetPos($GuiSettingsLeft)[2] + 5, 1, (WinGetClientSize($GuiSettings)[0] - WinGetPos($GuiSettingsLeft)[2]) - 6, WinGetClientSize($GuiSettings)[1] - 2, $SWP_SHOWWINDOW)


GUISetState(@SW_SHOW, $GuiSettings)

GUISetOnEvent($GUI_EVENT_CLOSE, 'GUISettingsEvent', $GuiSettings)

GUICtrlSetOnEvent($12431, 'GUISettingsMenu')
GUICtrlSetOnEvent($987456, 'GUISettingsMenu')

Func GUISettingsEvent()

	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
	        Exit
		Case $GUI_EVENT_RESTORE
			Beep(500, 1000)
		Case $GUI_EVENT_MINIMIZE
			Beep(500, 1000)
	EndSwitch
	
EndFunc

Func GUISettingsMenu()
    Beep(500, 1000)
EndFunc

While 1
	Sleep(20)
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Для создания дочерних окон используется последний параметр функции GUICreate
Код:
#NoTrayIcon
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiConstantsEx.au3>

Opt('GUIOnEventMode', 1)

$GuiSettings = GUICreate('Lang1', 500, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, 'GUISettingsEvent')
GUISetOnEvent($GUI_EVENT_RESTORE, 'GUISettingsEvent')
GUISetOnEvent($GUI_EVENT_MINIMIZE, 'GUISettingsEvent')
GUISetState(@SW_SHOW)

$H = WinGetClientSize($GuiSettings)[1] - 4
$GuiSettingsLeft = GUICreate('', 100, $H, 1, 1, BitOR($WS_BORDER, $WS_CHILD), -1, $GuiSettings)
$987456 = GUICtrlCreateLabel('PanelLeft', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetOnEvent(-1, 'GUISettingsMenu')
GUISetState(@SW_SHOW)

$W = WinGetClientSize($GuiSettings)[0] - WinGetPos($GuiSettingsLeft)[2] - 5
$GuiSettingsRight = GUICreate('', $W, $H, 104, 1, BitOR($WS_BORDER, $WS_CHILD), -1, $GuiSettings)
$12431 = GUICtrlCreateLabel('PanelRight', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetOnEvent(-1, 'GUISettingsMenu')
GUISetState(@SW_SHOW)

Func GUISettingsEvent()

    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_RESTORE
            Beep(500, 1000)
        Case $GUI_EVENT_MINIMIZE
            Beep(500, 1000)
    EndSwitch

EndFunc

Func GUISettingsMenu()
    Beep(500, 1000)
EndFunc

While 1
    Sleep(20)
WEnd
 
Автор
A

angro

Новичок
Сообщения
31
Репутация
1
Спасибо, но к сожалению с окнами сторонних программ так не получиться, поэтому нужен код с применением SetParent.
Или SetParent может применяться только к внешним окнам?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
но в остальном же работает. вопрос не стоял в том, чтобы встроить окно сторонней программы
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
joiner [?]
вопрос не стоял в том, чтобы встроить окно сторонней программы
Поддерживаю. Да и режим GUIOnEventMode не будет работать для чужих окон, даже если они "встроены". Чужое окно - это чужой процесс и все сообщения будут обрабатываться "там".
 
Автор
A

angro

Новичок
Сообщения
31
Репутация
1
Извините, но заголовок темы совершенно точно отражает вопрос. Решение любым способом не подходит.


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

Изменил код закомментировав стили, при сворачивании левого дочернего окна, начинает работать кнопка сворачивания основного окна, при сворачивании правого дочернего начинает работать кнопка выхода основного окна.
Или я чего то не понимаю или это баг. :scratch:

Код:
#NoTrayIcon
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiConstantsEx.au3>

Opt('GUIOnEventMode', 1)

$GuiSettings = GUICreate('Lang1', 500, 500);, Default, Default, $WS_THICKFRAME)

$GuiSettingsLeft = GUICreate('', 0, 0, 0, 0);, $WS_POPUPWINDOW)
$987456 = GUICtrlCreateLabel('PanelLeft', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))

$GuiSettingsRight = GUICreate('', 0, 0, 0, 0);, $WS_POPUPWINDOW)
$12431 = GUICtrlCreateLabel('PanelRight', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))

_WinAPI_SetParent($GuiSettingsLeft,  $GuiSettings)
_WinAPI_SetParent($GuiSettingsRight, $GuiSettings)

_WinAPI_SetWindowPos($GuiSettingsLeft,  $HWND_BOTTOM, 1, 1, 100, WinGetClientSize($GuiSettings)[1] - 2, $SWP_SHOWWINDOW)
_WinAPI_SetWindowPos($GuiSettingsRight, $HWND_BOTTOM, WinGetPos($GuiSettingsLeft)[2] + 5, 1, (WinGetClientSize($GuiSettings)[0] - WinGetPos($GuiSettingsLeft)[2]) - 6, WinGetClientSize($GuiSettings)[1] - 2, $SWP_SHOWWINDOW)


GUISetState(@SW_SHOW, $GuiSettings)

GUISetOnEvent($GUI_EVENT_CLOSE, 'GUISettingsEvent', $GuiSettings)

GUICtrlSetOnEvent($12431, 'GUISettingsMenu')
GUICtrlSetOnEvent($987456, 'GUISettingsMenu')

Func GUISettingsEvent()

    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_RESTORE
            Beep(500, 1000)
        Case $GUI_EVENT_MINIMIZE
            Beep(500, 1000)
    EndSwitch
   
EndFunc

Func GUISettingsMenu()
    Beep(500, 1000)
EndFunc

While 1
    Sleep(20)
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
angro [?]
Извините, но заголовок темы совершенно точно отражает вопрос
в заголовке совершенно не говорится о сторонней программе. в самом коде приведены создание и работа с окнами автоит
с чего такое упорство в применении _WinAPI_SetParent
 
Автор
A

angro

Новичок
Сообщения
31
Репутация
1
Считаю вопрос решённым, ниже пояснения и рабочий код. Почему именно так оставляю выяснить идущим следом.

1. Для работы кнопок основного окна, в нём должен быть размещён контрол (GUICtrlCreateDummy) не подходит.
Добавлен в код GUICtrlCreateLabel('', 0, 0, 0, 0)

2. Активация дочерних окон возможна только GUISetState(@SW_SHOW, $GuiSettingsLeft) иначе не работают контролы в дочерних окнах и кнопки в материнском окне (второе изменение без которого не работает).
В _WinAPI_SetWindowPos $SWP_SHOWWINDOW заменён на $SWP_NOACTIVATE и к дочерним окнам добавленно GUISetState(@SW_SHOW, $GuiSettingsLeft)

3. В основном окне ($GuiSettings) закомментирован код стиля и добавлены в листинг коды событий $GUI_EVENT_RESTORE и $GUI_EVENT_MINIMIZE
для проверки работоспособности.

Добавление1: В _WinAPI_SetWindowPos второй параметр должен быть $HWND_BOTTOM (ка и есть) если поставить $HWND_TOP снова не работают кнопки материнского окна.

Код:
#NoTrayIcon
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GuiConstantsEx.au3>

Opt('GUIOnEventMode', 1)

$GuiSettings = GUICreate('Lang1', 500, 500);, Default, Default, $WS_THICKFRAME)
GUICtrlCreateLabel('', 0, 0, 0, 0)

$GuiSettingsLeft = GUICreate('', 0, 0, 0, 0, $WS_POPUPWINDOW)
$987456 = GUICtrlCreateLabel('PanelLeft', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))

$GuiSettingsRight = GUICreate('', 0, 0, 0, 0, $WS_POPUPWINDOW)
$12431 = GUICtrlCreateLabel('PanelRight', 0, 0, 60, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))

_WinAPI_SetParent($GuiSettingsLeft,  $GuiSettings)
_WinAPI_SetParent($GuiSettingsRight, $GuiSettings)

_WinAPI_SetWindowPos($GuiSettingsLeft,  $HWND_BOTTOM, 1, 1, 100, WinGetClientSize($GuiSettings)[1] - 2, $SWP_NOACTIVATE)
_WinAPI_SetWindowPos($GuiSettingsRight, $HWND_BOTTOM, WinGetPos($GuiSettingsLeft)[2] + 5, 1, (WinGetClientSize($GuiSettings)[0] - WinGetPos($GuiSettingsLeft)[2]) - 6, WinGetClientSize($GuiSettings)[1] - 2, $SWP_NOACTIVATE)


GUISetState(@SW_SHOW, $GuiSettings)
GUISetState(@SW_SHOW, $GuiSettingsLeft)
GUISetState(@SW_SHOW, $GuiSettingsRight)

GUISetOnEvent($GUI_EVENT_CLOSE, 'GUISettingsEvent', $GuiSettings)
GUISetOnEvent($GUI_EVENT_RESTORE, 'GUISettingsEvent', $GuiSettings)
GUISetOnEvent($GUI_EVENT_MINIMIZE, 'GUISettingsEvent', $GuiSettings)

GUICtrlSetOnEvent($12431, 'GUISettingsMenu')
GUICtrlSetOnEvent($987456, 'GUISettingsMenu')

Func GUISettingsEvent()

    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_RESTORE
            Beep(500, 1000)
        Case $GUI_EVENT_MINIMIZE
            Beep(500, 1000)
    EndSwitch
   
EndFunc

Func GUISettingsMenu()
    Beep(500, 1000)
EndFunc

While 1
    Sleep(20)
WEnd
 
Верх