Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Границы родителя и дочернего окна

263
16 марта 2006 года
koltaviy
816 / / 16.12.2004
Я уже запарил наверно всех со своими вопросами, но постоянно появляются все новые и новые;)
Вопрос следующий:
Как сделать так, чтобы дочернее окно не залазело за границы родителя(не пряталось)..
Т.е. нужно отлавливать перемещение дочернего, изменение размеров дочернего и изменение размеров родителя..
Как отлавливать изменение размеров окон я естественно знаю, но не нашел события типа OnMoveP(
А может и как-то по-другому можно задать, типа свойство может у окон есть какое-нибудьP(
324
16 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by koltaviy
Я уже запарил наверно всех со своими вопросами, но постоянно появляются все новые и новые;)
Вопрос следующий:
Как сделать так, чтобы дочернее окно не залазело за границы родителя(не пряталось)..
Т.е. нужно отлавливать перемещение дочернего, изменение размеров дочернего и изменение размеров родителя..
Как отлавливать изменение размеров окон я естественно знаю, но не нашел события типа OnMoveP(
А может и как-то по-другому можно задать, типа свойство может у окон есть какое-нибудьP(



Используй WM_WINDOWPOSCHANGED (ING)

263
16 марта 2006 года
koltaviy
816 / / 16.12.2004
Цитата:
Originally posted by AndreySar
Используй WM_WINDOWPOSCHANGED (ING)


Не понял!!P(
Как в Visual Studio работать с WM_EVENT я знаю, а куда это "засунуть" в 6 Билдере?P(

263
18 марта 2006 года
koltaviy
816 / / 16.12.2004
Цитата:
Originally posted by koltaviy
Не понял!!P(
Как в Visual Studio работать с WM_EVENT я знаю, а куда это "засунуть" в 6 Билдере?P(


Вообщем куда это "засовывать" мне объяснили;) :
1)Пишем в header'е формы:

 
Код:
public:
        virtual void __fastcall WndProc(Messages::TMessage &Message);

А в source:
 
Код:
__fastcall TMDIChild::TMDIChild(TComponent *Owner)
    : TForm(Owner)
{WindowProc=WndProc;
}

Потом описываем функцию:
 
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &Message)
{ 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);
}

То сообщение выводится!, т.е. "система" работает.
Выводит его раз пять, а потом опять пишет, что класс не найден..
Чо я неправильно делаю??..
15K
21 марта 2006 года
Red Alert
15 / / 19.03.2006
Все просто, батенька.
Вот этого:

 
Код:
__fastcall TMDIChild::TMDIChild(TComponent *Owner)
    : TForm(Owner)
{WindowProc=WndProc;
}



делать ненадо, поскольку:


 
Код:
public:
        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;
}



Если написать перекрытый метод WndProc таким образом, то класс формы перестанет обрабатывать ВСЕ поступающие ему сообщения. Поэтому надо писать так:

 
Код:
void __fastcall TMDIChild::WndProc(Messages::TMessage &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);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог