Как встроить форму MDI в другое приложение?

мы пытаемся встроить наше приложение в другое приложение, которое предлагает интерфейс через UserControl.

Легко создать пользовательский элемент управления, содержащий обычную форму Windows.Form. Но как это сделать, если встраиваемая форма имеет свойство IsMdiContainer == true?

Спасибо


person Robert Hearle    schedule 01.04.2011    source источник
comment
Вы этого не сделаете, это невозможно.   -  person Hans Passant    schedule 01.04.2011


Ответы (2)


Я не думаю, что это будет возможно потому что:

Родительская форма многодокументного интерфейса (MDI) должна быть окном верхнего уровня.

Если вы попытаетесь установить родительский элемент для MdiContainer, вы получите/должны получить исключение. Единственный способ обойти это — изменить дизайн окна, которое вы пытаетесь внедрить. Либо обойдитесь без концепции MDI, либо, если она вам действительно нужна, реализуйте ее как настраиваемый элемент управления, который ведет себя как MDI, но без ограничений. (Это сложный заказ, скорее всего, требующий большого количества нестандартных рисунков.)

На самом деле существует хакерский подход, при котором вы можете переназначать окна во время выполнения из других процессов через SetParent. Так, например, вы можете «украсть» оконное приложение калькулятора и разместить его внутри другого MDI, но это имеет тенденцию быть очень нестабильным, особенно для более сложных приложений. Вам нужно будет запустить приложение MDI как отдельный процесс, а затем вызвать SetParent из размещенного приложения. Возможно, стоит попробовать, если ни один из вышеупомянутых вариантов не подходит вам, но наиболее вероятным результатом будет исключение во время выполнения.

person Paul Sasik    schedule 01.04.2011
comment
Нет никакой гарантии, что SetParent будет правильно работать с дочерними окнами MDI. Вы возможно сможете удалить флаг стиля WS_EX_MDICHILD и изменить его родитель, но я никогда не пробовал. В любом случае, как объясняет ваш ответ, это не очень хорошее решение. - person Cody Gray; 01.04.2011

Вы можете использовать следующий подход, он не автоматический, но он выполнит свою работу.

1) В вашем пользовательском элементе управления объявите свое приложение Windows, которое является хостом MDI. 2) Сопоставьте функциональность создания и обработки новых окон с панелью инструментов в пользовательском элементе управления или вы можете сопоставить ее с пользовательским элементом управления. 3) Каждый раз, когда вы создаете новое окно, установите родителем MDI окно, которое вы объявили на шаге 1.

Основная идея заключается в этом сообщении Панель C# как контейнер MDI

У подхода есть 1 проблема. Когда вы максимизируете свое дочернее окно, оно максимизируется и охватывает всю область управления пользователя, и вы не увидите его строку заголовка. Я считаю, что вы можете избавиться от этой ошибки, установив максимальный размер дочернего окна MDI немного меньше, чем размер пользовательского элемента управления

person Jose Manuel Ojeda    schedule 02.05.2011