Есть новая надежда? Как сделать окно ребенком MDI - PullRequest
1 голос
/ 24 февраля 2009

Получил некоторые формы / элементы управления C #, которые можно вызывать либо из элемента управления C # в Winform в приложении Winforms MDI, либо из того же элемента управления C #, который используется приложением PowerBuilder MDI через COM.

Я использовал вызов WinAPI SetParent для присоединения форм к MDI.

  1. Он работает (или, кажется, работает) в обеих средах.
  2. Позволяет дочернему окну иметь свой собственный WindowState (Normal, Maximized) вместо того, чтобы брать уже открытое дочернее окно (что было настоящей болью).

Скажем, элемент управления называется T. Код элемента управления T вызывает форму D.

Элемент управления T находится на форме X.
Элемент управления T также находится в форме Y.

В .Net все хорошо, и форма D остается в пределах MDI.

в PB:
Управление T находится на управлении PB PX. Контроль T также находится на контроле PB PY.

С ПХ все хорошо.
Однако для PY есть проблема - форма D, похоже, не становится дочерним элементом MDI - она ​​может выходить за пределы приложения и иметь значок на панели задач. Я подчеркиваю, что здесь используются те же объекты, что и те, которые работают. SetParent - это буквально та же строка кода.

Дальнейшие исследования показали, что SetParent на самом деле не работает для правильного MDI-кодирования - но это нормально, потому что нам не нужно объединять меню и т. Д.

Интересно, мы обнаружили, что хотя SetParent кажется «работающим», вы не получите обратно дескриптор, если попробуете GetParent ...

Form form = new MyForm();
WindowsMessageHelper.SetParent(form.Handle, MDIParentHandle); //passed down 
int parentHandle = WindowsMessageHelper.GetParent(form.Handle);

parentHandle всегда будет 0 ....

Есть ли способ заставить форму D вести себя при любых обстоятельствах? Мои собственные исследования не были многообещающими. На самом деле я не хочу возвращаться и переписывать свои формы в качестве элементов управления, чтобы PowerBuilder управлял ими - главным образом потому, что может быть несколько экземпляров каждой формы, и PowerBuilder должен был бы обрабатывать это (вместо получил это в приложении .net).

Могу ли я подчеркнуть, что в .Net проблемы НЕТ, проблема проявляется только в приложении PowerBuilder

Ответы [ 3 ]

1 голос
/ 25 февраля 2009

В итоге мы обнаружили, что разница в том, что PB делает настройку .MDIParent для контрольной PX (той, в которой работает вызов формы D), но не для PY.

Как только это было отсортировано, мы получили правильный дескриптор MDIParent, и теперь все в порядке.

0 голосов
/ 24 февраля 2009

Если единственная проблема, которую вы еще не решили, это то, что GetParent не работает, возможно, вы сможете с этим смириться.

РЕДАКТИРОВАТЬ: но у Аскера больше проблем.

Для выполнения этой работы необходимо выполнить несколько операций по API. Вам будет проще сделать это пользовательским элементом управления и разместить его на собственном родителе MDI при использовании его через интерфейс VIA COM или на потомке .NET MDI при размещении его в родителе .NET MDI.

Существуют различные базовые оконные процедуры (DefWindowProc и DefMdiChildProc), которые необходимо использовать здесь, и для выполнения этой работы вы в конечном итоге реализуете DefMdiChildProc.

Если вы использовали отражатель .NET, вы можете найти способ заставить System.Windows.Forms.Form вызывать DefMdiChildProc для вас.

0 голосов
/ 24 февраля 2009

Ваш ребенок должен быть System.Windows.Forms.Form и установить его свойство MdiParent в окно Патента MDI (не его Родителя).

Контейнер также должен следовать нескольким правилам.

Прочтение инструкции MDI на MSDN может помочь в дальнейшем.


Вариант второй: вы не сможете сделать это с помощью одного элемента управления. Instad рассмотрим состав основной реализации в двух обёртках. Первая оболочка действует как дочерний объект WinForms MDI, вторая - как оболочка COM для использования в любой среде GUI, в которой работает PowerBuilder.

...