Перекрытие дочерних окон
От: Vaynamond Россия  
Дата: 23.01.20 14:13
Оценка:
Гуру, нужна помощь!

Есть древний интерфейс, написанный на чистом WinAPI.
Структура примерно такая: главное окно программы, в клиентской области располагается еще одно окно (дочернее к главному),
у которого, в свою очередь, есть два дочерних окна: Окно_1 и Окно_2 (создаются именно в такой последовательности).

Суть проблемы: если Окно_2 при выводе частично закрывает Окно_1, то когда активизируется Окно_1, Окно_2 продолжает
перекрывать Окно_1 (хотя становится неактивным и не имеет фокуса ввода).
Из-за чего может быть такое проявление?

Родительское окно имеет стили WS_CHILDWINDOW, WS_VISIBLE, WS_CLIPSIBLING, WS_CLIPCHILDREN и расширенные стили
WS_EX_LEFT, WS_EX_LTREADING, WS_EX_RIGHTSCROLLBAR, WS_EX_CLIENTEDGE.

Оба дочерних окна окна имеют стили WS_CAPTION, WS_CHILDWINDOW, WS_VISIBLE, WS_CLIPSIBLING, WS_SYSMENU, WS_THICKFRAME
и расширенные стили WS_EX_LEFT, WS_EX_LTREADING, WS_EX_RIGHTSCROLLBAR, WS_EX_DLGMODALFRAME, WS_EX_WINDOWEDGE.
Re: Перекрытие дочерних окон
От: qaz77  
Дата: 23.01.20 15:13
Оценка:
Здравствуйте, Vaynamond, Вы писали:

V>Суть проблемы: если Окно_2 при выводе частично закрывает Окно_1, то когда активизируется Окно_1, Окно_2 продолжает

V>перекрывать Окно_1 (хотя становится неактивным и не имеет фокуса ввода).

Для дочерних окон понятие активности не используется, а фокус ввода не влияет на Z-order.
Т.к. оба дочерних окна имеют стиль WS_CLIPSIBLING, то при отрисовке нижнего будет клипаться кусок, закрытый верхним.

Т.е. автоматом желаемый функционал не получить.
Но можно вручную менять Z-order с помощью SetWindowPos при смене фокуса.
Например, ловим в дочерних окнах WM_SETFOCUS и ставим себя на вершину Z-order:
SetWindowPos(hWnd, HWHD_TOP, ... SWP_NOMOVE | SWP_NOSIZE);

Еще лучше с помощью BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos, чтобы меньше мерцало при переключении.
Re[2]: Перекрытие дочерних окон
От: Vaynamond Россия  
Дата: 24.01.20 08:30
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, Vaynamond, Вы писали:


V>>Суть проблемы: если Окно_2 при выводе частично закрывает Окно_1, то когда активизируется Окно_1, Окно_2 продолжает

V>>перекрывать Окно_1 (хотя становится неактивным и не имеет фокуса ввода).

Q>Для дочерних окон понятие активности не используется, а фокус ввода не влияет на Z-order.

Q>Т.к. оба дочерних окна имеют стиль WS_CLIPSIBLING, то при отрисовке нижнего будет клипаться кусок, закрытый верхним.

Q>Т.е. автоматом желаемый функционал не получить.

Q>Но можно вручную менять Z-order с помощью SetWindowPos при смене фокуса.
Q>Например, ловим в дочерних окнах WM_SETFOCUS и ставим себя на вершину Z-order:
Q>
Q>SetWindowPos(hWnd, HWHD_TOP, ... SWP_NOMOVE | SWP_NOSIZE);
Q>

Q>Еще лучше с помощью BeginDeferWindowPos/DeferWindowPos/EndDeferWindowPos, чтобы меньше мерцало при переключении.
Получилось!
Огромный респект!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.