Автор Тема: [Элементы GUI] GUIOnEventMode + SetParent не работаю кнопки  (Прочитано 459 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн angro [?]

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

Код: AutoIt [Выделить]
#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
 


Русское сообщество AutoIt

[Элементы GUI] GUIOnEventMode + SetParent не работаю кнопки
« Отправлен: Апрель 03, 2018, 16:05:55 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3832
  • Репутация: 1014
    • Награды
  • Версия AutoIt: 3.3.14.0
Для создания дочерних окон используется последний параметр функции GUICreate
Код: AutoIt [Выделить]
#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


Оффлайн angro [?]

  • Новичок
  • *
  • Сообщений: 21

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

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2711
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
но в остальном же работает. вопрос не стоял в том, чтобы встроить окно сторонней программы
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: [Элементы GUI] GUIOnEventMode + SetParent не работаю кнопки
« Ответ #3 Отправлен: Апрель 03, 2018, 18:57:56 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3832
  • Репутация: 1014
    • Награды
  • Версия AutoIt: 3.3.14.0
joiner  [?]
Цитировать
вопрос не стоял в том, чтобы встроить окно сторонней программы
Поддерживаю. Да и режим GUIOnEventMode не будет работать для чужих окон, даже если они "встроены". Чужое окно - это чужой процесс и все сообщения будут обрабатываться "там".

Оффлайн angro [?]

  • Новичок
  • *
  • Сообщений: 21

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


Добавлено: Апрель 03, 2018, 20:10:35
Изменил код закомментировав стили, при сворачивании левого дочернего окна, начинает работать кнопка сворачивания основного окна, при сворачивании правого дочернего начинает работать кнопка выхода основного окна.
Или я чего то не понимаю или это баг.  :think:

Код: AutoIt [Выделить]
#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
 

« Последнее редактирование: Апрель 03, 2018, 20:10:35 от angro, Причина: Объединение сообщений »

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2711
  • Репутация: 459
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
angro  [?]
Цитировать
Извините, но заголовок темы совершенно точно отражает вопрос
в заголовке совершенно не говорится о сторонней программе. в самом коде приведены создание и работа с окнами AutoIt
с чего такое упорство в применении _WinAPI_SetParent

Помечен как лучший ответ пользователем angro Отправлен Апрель 03, 2018, 22:26:20

Оффлайн angro [?]

  • Новичок
  • *
  • Сообщений: 21

  • Автор темы
  • Репутация: 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 снова не работают кнопки материнского окна.

Код: AutoIt [Выделить]
#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
 

« Последнее редактирование: Апрель 03, 2018, 23:20:09 от angro, Причина: Добавление1 »

Русское сообщество AutoIt

Re: [Элементы GUI] GUIOnEventMode + SetParent не работаю кнопки
« Ответ #7 Отправлен: Апрель 03, 2018, 22:26:08 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
4955 Просмотров
Последний ответ Февраль 04, 2010, 04:43:27
от pgs2
4 Ответов
5688 Просмотров
Последний ответ Апрель 27, 2010, 11:05:37
от pvnn
2 Ответов
2861 Просмотров
Последний ответ Май 17, 2011, 13:31:55
от CreatoR
0 Ответов
1113 Просмотров
Последний ответ Август 15, 2013, 11:16:07
от AZJIO
4 Ответов
2288 Просмотров
Последний ответ Апрель 27, 2014, 20:48:50
от alex33
2 Ответов
1188 Просмотров
Последний ответ Октябрь 01, 2014, 12:52:50
от maks.plotnikoff
0 Ответов
558 Просмотров
Последний ответ Октябрь 01, 2014, 12:44:43
от madmasles
0 Ответов
500 Просмотров
Последний ответ Январь 27, 2015, 21:28:21
от madmasles
0 Ответов
404 Просмотров
Последний ответ Апрель 26, 2016, 15:37:27
от Vovsla
1 Ответов
171 Просмотров
Последний ответ Май 15, 2018, 20:52:02
от Alofa