Как сделать так, чтобы дочернее окно MDI оставалось поверх своих братьев и сестер?
-
09-09-2019 - |
Вопрос
Этот вопрос связан с мой предыдущий.
У меня есть MDI-приложение MFC (VC6), которое имеет несколько дочерних окон MDI, действующих как разные представления для одного документа.
Можно ли установить один из этих фреймов таким образом, чтобы он оставался поверх других?
Я пытался дозвониться
SetWindowPos(
&GetParentFrame()->wndTopMost,
0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE);
и
ModifyStyleEx(0, WS_EX_TOPMOST);
из CMDIChildWnd, но, похоже, ни то, ни другое не работает.
Решение
В вашем классе CMDIChildWnd (обычно CChildFrame) добавьте статический HWND m_hTopWnd
.Установите его равным HWND дочернего элемента, который вы хотите всегда быть сверху.
Ручка WM_WINDOWPOSCHANGED
в CChildFrame
.В обработчике проверьте, является ли текущий m_hWnd == m_hTopWnd
.Если нет, позвоните
::SetWindowPos(m_hTopWnd, HWND_TOP, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
Таким образом, всякий раз, когда устанавливается положение любого дочернего окна MDI, окно "всегда сверху" будет возвращено наверх.
Также обрабатывать WM_CLOSE
и когда верхнее окно закрывается, установите m_hTopWnd = NULL.
Смотрите также: Статья CodeProject и База знаний MSDN
Другие советы
Вы уверены, что это хороший дизайн пользовательского интерфейса - держать дочернее окно поверх остальных?Разве это не должно стать отдельным самым верхним фреймом?Или панель управления?