WM_PARENTNOTIFY или WM_DESTROY или ...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

WM_PARENTNOTIFY или WM_DESTROY или ...

Сообщение Antonariy » 18.06.2007 (Пн) 15:48

Сложилась такая ситуация: основной модуль программы содержит mdi-окно, в котором нужно отобразить в режиме mdi-child окно из другого модуля (dll). Тупо сделать mdichild.show не получается - говорит, негде отобразить. Тогда я решил сделать форму с BorderStyle = None и ляпить ее на mdi-child, сделанный в основном модуле, с помощью SetParent. На форме из dll есть кнопка "закрыть", которая делает unload, но при этом контейнер естественно остается нетронутым.
Рассмотрел 2 выхода:
1. Сабклассинг контейнера. Перед уничтожением форма по идее должна отправить WM_PARENTNOTIFY контейнеру, но что-то его не видать.
2. Сабклассинг формы. Отловить WM_DESTROY и отправить тоже самое контейнеру. Делал SendMessage(mdichild.hwnd, WM_DESTROY, 0, 0), но он не реагирует, а на WM_NCDESTROY валится. Я туплю или где?
3. Какие еще возможны варианты?

И еще вопрос: как передать размер окна в lParam для WM_SIZE ?
Лучший способ понять что-то самому — объяснить это другому.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 18.06.2007 (Пн) 16:22

если я правильно понял:
Dim hw As Long
hw = FindWindowEx(MDIForm1.hwnd, 0, "MDICLIENT", "")
SendMessage hw, WM_MDIDESTROY, mdichild.hwnd, 0

P.S.
lParam = W Or (&H10000 * H)

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Сообщение Niko » 19.06.2007 (Вт) 8:14

Закрыть контейнер думаю можно событием, которое сгенерится в окне из ддл-ки при его закрытии и отловится контейнером.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 19.06.2007 (Вт) 10:00

Niko
Вся архитектура программы использует позднее связывание через интерфейсы, так что никаких событий.

EUGY
Спасибо за WM_MDIDESTROY и прочее, однако найти MDICLIENT можно проще - GetParent(mdichild.hWnd) :wink:
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 76

    TopList