События дочерних форм Mdi приложения
Как отловить события открытия/закрытия (активации/деактивации) дочерних форм в MDI приложении..?
Посылай свои сообщения (типа "дочернее окно 1 активировано") из дочерних окон родительскому.
Посылай свои сообщения (типа "дочернее окно 1 активировано") из дочерних окон родительскому.
а постандартней никак нельзя?
а постандартней никак нельзя?
Разве что попробовать создать VCL-обработчки стандартный WM_MDI-сообщений.
а постандартней никак нельзя?
Куда уж стандартнее -- пользоваться стандартным механизмом сообщений Windows...
а какие конкретно сообщения там надо обрабатывать? можно примерчик если не трудно?
Что-то в таком духе.
В MDIForm.cpp пишем:
{
TMDIChild *c = (TMDIChild*)FormObj;
if(c != NULL)
ShowMessage(AnsiString("Активирован MDIChild ") + c->Caption);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ChildDeactivated(int FormObj)
{
TMDIChild *c = (TMDIChild*)FormObj;
if(c != NULL)
ShowMessage(AnsiString("Дективирован MDIChild ") + c->Caption);
}
В MDIForm.h в описании класса:
void __fastcall ChildDeactivated(int FormObj);
virtual void __fastcall Dispatch(void *Message)
{
PMessage m = (PMessage)Message;
switch(m->Msg)
{
case WM_USER + WM_I_HAVE_ACTIVATED:
ChildActivated(m->LParam);
break;
case WM_USER + WM_I_HAVE_DEACTIVATED:
ChildDeactivated(m->LParam);
break;
default:
TForm::Dispatch(Message);
break;
}
};
Не забыть написать где-нибудь:
#define WM_I_HAVE_DEACTIVATED 602
В CildWin.cpp:
{
PostMessage(MainForm->Handle,WM_USER + WM_I_HAVE_ACTIVATED, 0, (int)this);
}
//---------------------------------------------------------------------------
void __fastcall TMDIChild::FormDeactivate(TObject *Sender)
{
PostMessage(MainForm->Handle,WM_USER + WM_I_HAVE_DEACTIVATED, 0, (int)this);
}
Вот такой скромный пример.
Вот такой скромный пример.
Все конечно хорошо, я этот вариант уже рассматривал когда нужно обрабатывать сообщения Windows приходящие к дочерним окнам... причем там есть уже предусмотренные сообщения (без использования WM_USER).
Однако, если в приложении будет сотник окон к примеру, обрабатывать сообщения для каждого окна не совсем красиво, хочется обрабатывать какое-то сообщение родительского окна, что что-то показалось/скрылось/активировалось/деактивировалось итд итп... вот какая задача стоит:)
забыл сказать - дочерние формы MDI-приложения вызываются из DLL, не хотелось бы туда вставлять какие-то обработчики по этому поводу:)
Хех... Как будто их там нет... Всё виндовое межмордие -- сплошные обработчики сообщений, так что не комплексуй. Запусти какой-нибудь WinSpy и посмотри, например, сколько мессаг M$ Excel сам себе посылает.
Хех... Как будто их там нет... Всё виндовое межмордие -- сплошные обработчики сообщений, так что не комплексуй. Запусти какой-нибудь WinSpy и посмотри, например, сколько мессаг M$ Excel сам себе посылает.
да дело не в комплексах... я же говорю дочерние формы находятся в DLL, а этих DLL куча, причем не маленькая... не хотелось бы перекомпилить все эти DLL, хочется решить проблему на уровне родительского окна... неужели туда не посылается никаких уведомлений? :x