WinForms как часть Win32API MDI

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

WinForms как часть Win32API MDI

Сообщение i_van »

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

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

Заранее спасибо за все отклики и линки.
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Это конечно извращение, но думаю что SetParent() должен помочь.
Передается туда Form.Handle
Аватара пользователя
Azazello
Житель
Сообщения: 769
Зарегистрирован: 16 янв 2007, 04:31

Сообщение Azazello »

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

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

HWND hMDIClient = ... ;// get MDI Client
TMyWinForms my_form = new TMyWinForms( hMDICleint );
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

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

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

HWND hMDIClient = ... ;// get MDI Client
TMyWinForms my_form = new TMyWinForms( hMDICleint );
Наверное, потому что это не Дельфи. :D
Аватара пользователя
Azazello
Житель
Сообщения: 769
Зарегистрирован: 16 янв 2007, 04:31

Сообщение Azazello »

Я не могу понять, почему его сразу нельзя создать как child window? Или его надо сделать dockable?

Или в C# окна динамически создавать нельзя?!?!?... ;)...
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Azazello писал(а):Я не могу понять, почему его сразу нельзя создать как child window? Или его надо сделать dockable?

Или в C# окна динамически создавать нельзя?!?!?... ;)...
Можно создать динамически, но в качестве родительского можно указывать только С# объект.
Аватара пользователя
Azazello
Житель
Сообщения: 769
Зарегистрирован: 16 янв 2007, 04:31

Сообщение Azazello »

Понятно. Вот уроды ;)...

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

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

Сообщение i_van »

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

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

frmGraphics^ frmGrph = gcnew frmGraphics();         
HWND pHandle = (HWND) frmGrph->Handle.ToPointer(); 
SetParent( pHandle, hWnd);
frmGrph->Show();
Спасибо всем.
i_van
Завсегдатай
Сообщения: 251
Зарегистрирован: 09 сен 2004, 23:58

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

Сообщение 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 невозможно.

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

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