Страница 1 из 1

WinForms как часть Win32API MDI

Добавлено: 18 июл 2007, 14:45
i_van
Приложение представляет собой смешанный unmanaged/managed C++, and C# кодю Это MDI application на Win32 API.

Можно ли создать в managed части приложения окно WinForms и прицепить его как child к основному parent Win32 MDI?

Заранее спасибо за все отклики и линки.

Добавлено: 18 июл 2007, 16:48
aldep
Это конечно извращение, но думаю что SetParent() должен помочь.
Передается туда Form.Handle

Добавлено: 18 июл 2007, 18:16
Azazello
А почему нельзя сразу создать WinForms объект с MDIClient как parent window?
Типа (я C# не знаю, но в C++Builder и OWL это возможно)

Код: Выделить всё

HWND hMDIClient = ... ;// get MDI Client
TMyWinForms my_form = new TMyWinForms( hMDICleint );

Добавлено: 18 июл 2007, 18:23
aldep
Azazello писал(а):А почему нельзя сразу создать WinForms объект с MDIClient как parent window?
Типа (я C# не знаю, но в C++Builder и OWL это возможно)

Код: Выделить всё

HWND hMDIClient = ... ;// get MDI Client
TMyWinForms my_form = new TMyWinForms( hMDICleint );
Наверное, потому что это не Дельфи. :D

Добавлено: 18 июл 2007, 18:32
Azazello
Я не могу понять, почему его сразу нельзя создать как child window? Или его надо сделать dockable?

Или в C# окна динамически создавать нельзя?!?!?... ;)...

Добавлено: 18 июл 2007, 19:14
aldep
Azazello писал(а):Я не могу понять, почему его сразу нельзя создать как child window? Или его надо сделать dockable?

Или в C# окна динамически создавать нельзя?!?!?... ;)...
Можно создать динамически, но в качестве родительского можно указывать только С# объект.

Добавлено: 18 июл 2007, 20:24
Azazello
Понятно. Вот уроды ;)...

Тогда, наверное, нужно:

1. Создать WinForms объект Form.
2. Пройтись по детям Frame window и достать MDIClient handle, если C# не даёт этого handle прямо.
3. Выставить через SetWindowLong() WS_CHILD стиль. Может добавить/убрать что-то.
4. SetParent() - поменять parent window на MDIClient.

Добавлено: 19 июл 2007, 16:02
i_van
aldep писал(а):Это конечно извращение, но думаю что SetParent() должен помочь.
Передается туда Form.Handle
Удивительное рядом! Работает! Хотя, конечно, работает криво.

Код: Выделить всё

frmGraphics^ frmGrph = gcnew frmGraphics();         
HWND pHandle = (HWND) frmGrph->Handle.ToPointer(); 
SetParent( pHandle, hWnd);
frmGrph->Show();
Спасибо всем.

Re: WinForms как часть Win32API MDI

Добавлено: 30 ноя 2007, 14:20
i_van
Чтобы закрыть тему. Может кому понадобится при миграции на managed code.

Cвязь MDI_Child — MDI_Parent (read MDI_Client) это не то же самое что связь "чистый" Child — "чистый" Parent. Последнее отношение без труда устанавливается функцией SetParent() и работает.
В оригинале Win32 MDI_Client создает MDI_Child и вмешаться в его работу не очень-то и получается. Можно создать Child ручками и установить все стили MDI_Child, но подправить MDI_Client невозможно.

Как следствие - не менятся меню, не переустанавливается фокус и т.п.

Приходится искать другие способы коммуникации окон.