Что нового

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

musicstashall

Чайник
Сообщения
222
Репутация
2
Всем доброго.

Заморочился с окнами. Задача следующая: родительское окно имеет три разноцветные зоны — 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 214
Репутация
1 114
лейбы родительского окна, которыми создается цвет фона, перекрывают все дочерние окна, нужно какое-то решение
Вот вам решение: убрать лейбы, изменить размер дочерних окон до размера лейбов и раскрасить дочерние окна в цвет лейбов.
Сообщение автоматически объединено:

Можно ещё "слоёный пирог" организовать - заменить лейбы на 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

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

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

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

joiner

Модератор
Локальный модератор
Сообщения
3 012
Репутация
502
winapi функции обновления и перерисовки окна
 
Верх