Есть некоторые формы / элементы управления C #, которые можно вызывать либо из элемента управления C # в Winform в приложении Winforms MDI, либо из того же элемента управления C #, который используется приложением PowerBuilder MDI через COM.
Я использовал вызов WinAPI SetParent для прикрепления форм к MDI.
- Он работает (или кажется, работает) в обеих средах.
- Это позволяет дочернему окну иметь собственное состояние WindowState (Normal, Maximized) вместо того, чтобы принимать состояние уже открытых дочерних окон (что было настоящей проблемой).
Скажем, элемент управления называется T. Код элемента управления T вызывает форму D.
Элемент управления T находится в форме X.
Элемент управления T также находится в форме Y.
В .Net все хорошо, и форма D остается в пределах MDI.
в PB:
Control T находится на PB control PX. Элемент управления T также находится на элементе управления PB PY.
Для PX все хорошо.
Для 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.