Ограничение перетаскиваемых дочерних окон в родительском окне?

Пожалуйста, взгляните на этот снимок экрана:

введите здесь описание изображения

Как видите, дочерние окна "Исполняемые модули" и "Потоки" могут свободно перемещаться по похожей на песочницу "Themida". родительское окно, и если они перетаскиваются за край, переполнение просто скрывается. Как я могу создать этот эффект?


person Vincent Lindgren    schedule 23.08.2015    source источник
comment
Спасибо за добавление изображения для меня.   -  person Vincent Lindgren    schedule 23.08.2015


Ответы (2)


Это многодокументный интерфейс (MDI). Содержащее окно с темно-серым фоном — это окно клиента MDI, а окна внутри — дочерние окна MDI.

Использование MDI не одобрялось Microsoft в течение многих лет, поэтому вы можете подумать дважды, прежде чем использовать его в новом приложении.

person David Heffernan    schedule 23.08.2015
comment
Есть ли способ добиться (визуально или функционально) подобного эффекта? Я пишу приложение, которое встраивает окно игры в мое собственное окно в качестве дочернего элемента, а затем предоставляет всевозможные инструменты для взаимодействия с ним. Я хотел, чтобы каждый инструмент и само окно игры были дочерними окнами MDI. - person Vincent Lindgren; 23.08.2015
comment
@VincentLindgren Базовая технология все еще работает, поэтому ничто не мешает вам использовать MDI, просто рекомендуется больше не использовать такой интерфейс. - person Jonathan Potter; 23.08.2015
comment
MDI не объявлен устаревшим корпорацией Майкрософт. Microsoft рекомендует не использовать его из соображений удобства использования, но не из-за устаревания (см. Многодокументный интерфейс: Многим новым и опытным пользователям трудно научиться использовать приложения MDI. Поэтому вам следует рассмотреть другие модели пользовательского интерфейса. Однако вы можете использовать MDI для приложений, которые не вписываются в существующую модель.). - person IInspectable; 24.08.2015

Просто установите стиль окна на WS_CHILD, и окно будет ограничено родительским прямоугольником клиента.

Вы можете сделать это во время создания окна или после использования SetWindowLongPtr() и GetWindowLongPtr():

 SetWindowLongPtr(hwnd, GWL_STYLE, WS_CHILD | GetWindowLongPtr(hwnd, GWL_STYLE));

P.S. Вам не нужно создавать приложение MDI, чтобы иметь такое поведение.

person Frankie_C    schedule 23.08.2015