Приложение представляет собой смешанный unmanaged/managed C++, and C# кодю Это MDI application на Win32 API.
Можно ли создать в managed части приложения окно WinForms и прицепить его как child к основному parent Win32 MDI?
Заранее спасибо за все отклики и линки.
WinForms как часть Win32API MDI
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
- Azazello
- Житель
- Сообщения: 769
- Зарегистрирован: 16 янв 2007, 04:31
А почему нельзя сразу создать WinForms объект с MDIClient как parent window?
Типа (я C# не знаю, но в C++Builder и OWL это возможно)
Типа (я C# не знаю, но в C++Builder и OWL это возможно)
Код: Выделить всё
HWND hMDIClient = ... ;// get MDI Client
TMyWinForms my_form = new TMyWinForms( hMDICleint );
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
Наверное, потому что это не Дельфи.Azazello писал(а):А почему нельзя сразу создать WinForms объект с MDIClient как parent window?
Типа (я C# не знаю, но в C++Builder и OWL это возможно)Код: Выделить всё
HWND hMDIClient = ... ;// get MDI Client TMyWinForms my_form = new TMyWinForms( hMDICleint );

- Azazello
- Житель
- Сообщения: 769
- Зарегистрирован: 16 янв 2007, 04:31
- aldep
- Маньяк
- Сообщения: 1593
- Зарегистрирован: 18 фев 2003, 08:06
- Откуда: Toronto
- Контактная информация:
- Azazello
- Житель
- Сообщения: 769
- Зарегистрирован: 16 янв 2007, 04:31
Понятно. Вот уроды
...
Тогда, наверное, нужно:
1. Создать WinForms объект Form.
2. Пройтись по детям Frame window и достать MDIClient handle, если C# не даёт этого handle прямо.
3. Выставить через SetWindowLong() WS_CHILD стиль. Может добавить/убрать что-то.
4. SetParent() - поменять parent window на MDIClient.

Тогда, наверное, нужно:
1. Создать WinForms объект Form.
2. Пройтись по детям Frame window и достать MDIClient handle, если C# не даёт этого handle прямо.
3. Выставить через SetWindowLong() WS_CHILD стиль. Может добавить/убрать что-то.
4. SetParent() - поменять parent window на MDIClient.
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Удивительное рядом! Работает! Хотя, конечно, работает криво.aldep писал(а):Это конечно извращение, но думаю что SetParent() должен помочь.
Передается туда Form.Handle
Код: Выделить всё
frmGraphics^ frmGrph = gcnew frmGraphics();
HWND pHandle = (HWND) frmGrph->Handle.ToPointer();
SetParent( pHandle, hWnd);
frmGrph->Show();
-
- Завсегдатай
- Сообщения: 251
- Зарегистрирован: 09 сен 2004, 23:58
Re: WinForms как часть Win32API MDI
Чтобы закрыть тему. Может кому понадобится при миграции на managed code.
Cвязь MDI_Child — MDI_Parent (read MDI_Client) это не то же самое что связь "чистый" Child — "чистый" Parent. Последнее отношение без труда устанавливается функцией SetParent() и работает.
В оригинале Win32 MDI_Client создает MDI_Child и вмешаться в его работу не очень-то и получается. Можно создать Child ручками и установить все стили MDI_Child, но подправить MDI_Client невозможно.
Как следствие - не менятся меню, не переустанавливается фокус и т.п.
Приходится искать другие способы коммуникации окон.
Cвязь MDI_Child — MDI_Parent (read MDI_Client) это не то же самое что связь "чистый" Child — "чистый" Parent. Последнее отношение без труда устанавливается функцией SetParent() и работает.
В оригинале Win32 MDI_Client создает MDI_Child и вмешаться в его работу не очень-то и получается. Можно создать Child ручками и установить все стили MDI_Child, но подправить MDI_Client невозможно.
Как следствие - не менятся меню, не переустанавливается фокус и т.п.
Приходится искать другие способы коммуникации окон.