понедельник, 28 февраля 2011 г.

В чём разница между HWND_TOP и HWND_TOPMOST?

Это перевод What's the difference between HWND_TOP and HWND_TOPMOST? Автор: Реймонд Чен.

Специальные значения HWND_TOP и HWND_TOPMOST имеют похожие имена, но делают совершенно разные вещи, когда их передают в параметре hWndInsertAfter функции DeferWindowPos (или её аналога, к примеру, SetWindowPos). Для начала вам следует почитать обсуждение в MSDN, которое достаточно точно. Здесь я хочу обсудить это различие с точки зрения исторической перспективы в надежде, что взгляд с другой перспективы может улучшить ваше понимание.

Родственные окна (siblings) располагаются в определённом порядке, называемым Z-порядком (для целей нашего обсуждения мы также будем рассматривать окна верхнего уровня (top-level) как родственные. Фактически, именно Z-порядок окон верхнего уровня имеют в виду люди, когда говорят про "Z-порядок"; прим.пер.: окно верхнего уровня в Delphi обычно называется формой; примером других окон (не верхнего уровня) могут служить кнопки, панели и edit-ы).

Z-порядок может быть визуализирован в виде вертикального стека (стопки), с окнами "выше" или "ниже" определённого окна.

До Windows 3.0 поведение было очень просто: HWND_TOP поднимало окно на вершину в Z-порядке.

Windows 3.0 добавило концепцию "окна поверх всех" ("topmost"). Это такие окна верхнего уровня, которые всегда остаются "выше" прочих (не topmost) окон. Чтобы сделать обычное окно окном "поверх всех", вы вызываете DeferWindowPos (или её эквиваленты) с HWND_TOPMOST в hWndInsertAfter. Чтобы вернуть окно обратно к обычным окнам, нужно использовать HWND_NOTOPMOST.

В результате введения окон "поверх всех" HWND_TOP теперь поднимает окно "так высоко в Z-порядке, как это вообще возможно без нарушения правила о том, что topmost окна всегда будут поверх не topmost окон". Что это означает на практике?
  • Если окно является topmost-окном, то HWND_TOP разместит окно на самой вершине в Z-порядке.
  • Если окно не является topmost-окном, то HWND_TOP разместит окно поверх всех не topmost-окон (т.е. прямо под нижним topmost-окном, если таковое будет).
Примечание: обсуждение выше полностью игнорирует вопросы владельца (owner) и owned-окон. Я выбросил их из рассмотрения потому что они добавили бы слой усложенения, который отвлёк бы нас от главной темы.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.