Что нового

Разноцветный фон родительского окна и дочерние окна с элементами

musicstashall

Знающий
Сообщения
322
Репутация
7
Всем доброго.

Заморочился с окнами. Задача следующая: родительское окно имеет три разноцветные зоны — 35 пик под шапкой с черным цветом, средняя часть с белым, нижняя часть с кнопкой в дефолтном цвете (не знаю, что за цвет, важно его оставить). Два дочерних окна: в средней части — контент с элементами управления, в верхней, под шапкой, — как бы адресная строка, аля explorer, на нем планирую поставить ToolBar. Проблема естественно в отрисовке окон — лейбы родительского окна, которыми создается цвет фона, перекрывают все дочерние окна, нужно какое-то решение.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPISysWin.au3>
#include <WinAPIGdi.au3>
Opt("GUIOnEventMode", 1)
$gui1=GUICreate("Название окна", 400, 400, -1, -1, $WS_OVERLAPPEDWINDOW)

GUICtrlCreateLabel("", 0, 0, 400, 35)
GUICtrlSetBkColor(-1, 0)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKHEIGHT))
GUISetOnEvent($GUI_EVENT_RESIZED, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
_WinAPI_DwmExtendFrameIntoClientArea($gui1, _WinAPI_CreateMargins(0, 0, 35, 0))

GUICtrlCreateLabel("", 0, 35, 400, 265)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM))
GUICtrlCreateButton("OK", 300, 350, 80)

$gui2=GUICreate('', 380, 270, 10, 35, $WS_POPUP);, $WS_EX_MDICHILD)
GUISetBkColor(0x00FF00, $gui2)
GUICtrlCreateCheckbox("Checkbox", 150, 100)
GUICtrlCreateButton("Button", 10, 50)
GUICtrlCreateEdit("Edit", 10, 80, 100, 100)
GUICtrlCreateLabel("Здесь текст", 10, 220)

$gui3=GUICreate('', 300, 22, 80, 5, $WS_POPUP)
GUISetBkColor(0xFFFFFF, $gui3)
GUICtrlCreateCheckbox("Checkbox", 50, 0)
GUICtrlCreateInput('Input', 200, 0)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKRIGHT, $GUI_DOCKWIDTH))

_WinAPI_SetParent($gui2, $gui1)
_WinAPI_SetParent($gui3, $gui1)

GUISetState(@SW_SHOW, $gui1)
GUISetState(@SW_SHOW, $gui2)
GUISetState(@SW_SHOW, $gui3)
GUISwitch($gui2)

While 1
   Sleep(100)
WEnd

Func SpecialEvents()
   Switch @GUI_CtrlId
   Case $GUI_EVENT_CLOSE
      Exit
   Case $GUI_EVENT_RESIZED
      Local $pos=WinGetPos($gui1)
      WinMove($gui2, '',($pos[2]-380)/2, 35)
      WinMove($gui3, '', 80, 5, $pos[2]-80 , 22)
   EndSwitch
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
лейбы родительского окна, которыми создается цвет фона, перекрывают все дочерние окна, нужно какое-то решение
Вот вам решение: убрать лейбы, изменить размер дочерних окон до размера лейбов и раскрасить дочерние окна в цвет лейбов.
Сообщение автоматически объединено:

Можно ещё "слоёный пирог" организовать - заменить лейбы на gui
Код:
;~ GUICtrlCreateLabel("", 0, 35, 400, 265)
;~ GUICtrlSetBkColor(-1, 0xFFFFFF)
;~ GUICtrlSetState(-1, $GUI_DISABLE)
;~ GUICtrlSetResizing(-1, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKBOTTOM))
GUICreate("", 400, 265, 0, 35, $WS_CHILD, -1, $gui1)
GUISetBkColor(0xFFFFFF)
GUISetState(@SW_DISABLE)
GUISetState()
 
Последнее редактирование:
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
заменить лейбы на gui
Вот так я и сделал вчера. Но хотел избежать такого приема. Хорошо. Благодарю :acute:

*********************
Добавил еще стиль к родительскому окну, меньше мерцаний стало, совсем хорошо
$WS_CLIPCHILDREN

Но, при таком стиле, после восстановления из максимизации, нижний бар с кнопками не отрисовывается. Нужно дернуть за край окна, тогда отрисуется. Что можно сделать в таком случае?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
winapi функции обновления и перерисовки окна
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
winapi функции обновления и перерисовки окна

Я пробовал, бесполезно. Не действует, почему-то
Код:
_WinAPI_RedrawWindow($hWnd, $tRECT, 0, $RDW_INTERNALPAINT)

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

А может попробовать применить эту функцию:
Код:
_WinAPI_SetWindowRgn

Пример использования по ссылке. Только не удалять регион, а применить к региону цвет. Нарисовать рект по региону. Я бы хотел прихватить части элементов окна, например верхний и нижний участки Rebar'а, чтобы видны были только элементы, установленные в Rebar. Как думаете, стоит попробовать двигаться в эту сторону?
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
если установить стиль $WS_EX_MDICHILD
Код:
GUICreate('', 300, 22, 80, 5, $WS_POPUP, $WS_EX_MDICHILD, $gui1)

и убрать
Код:
_WinAPI_SetParent

то все работает нормально
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
если установить стиль $WS_EX_MDICHILD
Ну и дочернее окно заполняет весь контент родительского окна. Попробуй теперь изменить размеры дочернего.... Вообще, классно бы было, если бы дочернее оставалось в размерах.
Сообщение автоматически объединено:

А свернуть/развернуть?
 

joiner

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

musicstashall

Знающий
Сообщения
322
Репутация
7
Я имею ввиду, если убрать _WinAPI_SetParent, то при сворачивании родительского окна, дочернее, со стилем $WS_EX_MDICHILD , не сворачивается, это написано в справке. Если же использовать _WinAPI_SetParent, то дочернее окно с таким стилем будет заполнять весь контент родительского окна. Дело еще в том, что я встраиваю свое окно GUI в чужое WIN, поэтому здесь не помогает стиль $WS_EX_MDICHILD. Я хочу попробовать обрезать элементы окна с помощью
Код:
_WinAPI_SetWindowRgn
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
по факту окна сворачиваются при клике в родительском окне на "свернуть"? визуально

другой вопрос - встраивание в окно сторонней программы. об этом в теме, вроде как, ничего не написано.
 
Верх