public:
virtual void __fastcall WndProc(Messages::TMessage &Message);
Границы родителя и дочернего окна
Вопрос следующий:
Как сделать так, чтобы дочернее окно не залазело за границы родителя(не пряталось)..
Т.е. нужно отлавливать перемещение дочернего, изменение размеров дочернего и изменение размеров родителя..
Как отлавливать изменение размеров окон я естественно знаю, но не нашел события типа OnMoveP(
А может и как-то по-другому можно задать, типа свойство может у окон есть какое-нибудьP(
Цитата:
Originally posted by koltaviy
Я уже запарил наверно всех со своими вопросами, но постоянно появляются все новые и новые;)
Вопрос следующий:
Как сделать так, чтобы дочернее окно не залазело за границы родителя(не пряталось)..
Т.е. нужно отлавливать перемещение дочернего, изменение размеров дочернего и изменение размеров родителя..
Как отлавливать изменение размеров окон я естественно знаю, но не нашел события типа OnMoveP(
А может и как-то по-другому можно задать, типа свойство может у окон есть какое-нибудьP(
Я уже запарил наверно всех со своими вопросами, но постоянно появляются все новые и новые;)
Вопрос следующий:
Как сделать так, чтобы дочернее окно не залазело за границы родителя(не пряталось)..
Т.е. нужно отлавливать перемещение дочернего, изменение размеров дочернего и изменение размеров родителя..
Как отлавливать изменение размеров окон я естественно знаю, но не нашел события типа OnMoveP(
А может и как-то по-другому можно задать, типа свойство может у окон есть какое-нибудьP(
Используй WM_WINDOWPOSCHANGED (ING)
Цитата:
Originally posted by AndreySar
Используй WM_WINDOWPOSCHANGED (ING)
Используй WM_WINDOWPOSCHANGED (ING)
Не понял!!P(
Как в Visual Studio работать с WM_EVENT я знаю, а куда это "засунуть" в 6 Билдере?P(
Цитата:
Originally posted by koltaviy
Не понял!!P(
Как в Visual Studio работать с WM_EVENT я знаю, а куда это "засунуть" в 6 Билдере?P(
Не понял!!P(
Как в Visual Studio работать с WM_EVENT я знаю, а куда это "засунуть" в 6 Билдере?P(
Вообщем куда это "засовывать" мне объяснили;) :
1)Пишем в header'е формы:
Код:
А в source:
Код:
__fastcall TMDIChild::TMDIChild(TComponent *Owner)
: TForm(Owner)
{WindowProc=WndProc;
}
: TForm(Owner)
{WindowProc=WndProc;
}
Потом описываем функцию:
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &Message)
{ if (Message.Msg == WM_MOVE)
MessageBox(NULL,"pass","Res",MB_OK);
else
return;
}
{ if (Message.Msg == WM_MOVE)
MessageBox(NULL,"pass","Res",MB_OK);
else
return;
}
Но чо-то ничо не выходит. Пишем ошибку,типа, класс не найден.
Если описать так:
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &Message)
{ if (Message.Msg == WM_MOVE)
MessageBox(NULL,"pass","Res",MB_OK);
else
MessageBox(NULL,"pass","Res",MB_OK);
}
{ if (Message.Msg == WM_MOVE)
MessageBox(NULL,"pass","Res",MB_OK);
else
MessageBox(NULL,"pass","Res",MB_OK);
}
То сообщение выводится!, т.е. "система" работает.
Выводит его раз пять, а потом опять пишет, что класс не найден..
Чо я неправильно делаю??..
Вот этого:
Код:
__fastcall TMDIChild::TMDIChild(TComponent *Owner)
: TForm(Owner)
{WindowProc=WndProc;
}
: TForm(Owner)
{WindowProc=WndProc;
}
делать ненадо, поскольку:
Код:
public:
virtual void __fastcall WndProc(Messages::TMessage &Message);
virtual void __fastcall WndProc(Messages::TMessage &Message);
уже перекрывает метод WndProc родительского класса. Так что объявления в хидере формы вполне достаточно, причем необязательно делать его public - можно и private.
И вторая ошибка:
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &Message)
{ if (Message.Msg == WM_MOVE)
MessageBox(NULL,"pass","Res",MB_OK);
else
return;
}
{ if (Message.Msg == WM_MOVE)
MessageBox(NULL,"pass","Res",MB_OK);
else
return;
}
Если написать перекрытый метод WndProc таким образом, то класс формы перестанет обрабатывать ВСЕ поступающие ему сообщения. Поэтому надо писать так:
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &Message)
{
if (Message.Msg == WM_MOVE) MessageBox(NULL,"pass","Res",MB_OK);
TForm::WndProc(Message);
}
{
if (Message.Msg == WM_MOVE) MessageBox(NULL,"pass","Res",MB_OK);
TForm::WndProc(Message);
}
В этом случае, сообщение полученное окном сначала попадет в твой WndProc, а потом, если ты его не хочешь обрабатывать, в WndProc родителя.
Только еще одна ремарка:
Если ты захочешь обработать событие сам - и не передавать его родителю, тогда тебе надо в кейзе события делать return, установив Message.Result в соответствии с тем, что должно возвращзаться сообщением в случае его обработки (см. хелп для нужного события секция Return values).
Как пример, фрагмент кода запрещающего перерисовку фона окна:
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &Message)
{
if (Message.Msg == WM_ERASEBKGND)
{
Message.Result=1;
return;
}
TForm::WndProc(Message);
}
{
if (Message.Msg == WM_ERASEBKGND)
{
Message.Result=1;
return;
}
TForm::WndProc(Message);
}