Как сделать так, чтобы дочернее окно MDI оставалось поверх своих братьев и сестер?

StackOverflow https://stackoverflow.com/questions/594375

  •  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

Другие советы

Вы уверены, что это хороший дизайн пользовательского интерфейса - держать дочернее окно поверх остальных?Разве это не должно стать отдельным самым верхним фреймом?Или панель управления?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top