Страница 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 );
Наверное, потому что это не Дельфи.

Добавлено: 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 невозможно.
Как следствие - не менятся меню, не переустанавливается фокус и т.п.
Приходится искать другие способы коммуникации окон.