Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как обработать OnClick до того как он попадёт на


Автор: SenkraD 5.6.2007, 15:05
Сообственно, есть форма на ней кнопки и другие контролы. Можно ли как-то сделать так, чтобы при щелчке на кнопкк, к примеру, сработал сначала обработчик OnClick самой формы. Я пробовал и сообщения ловить и подменять оконную процедуру, но всё по нулям. Помогите, пожалуйста.

Автор: sp75 5.6.2007, 15:47
Цитата(SenkraD @ 5.6.2007,  15:05)
Сообственно, есть форма на ней кнопки и другие контролы. Можно ли как-то сделать так, чтобы при щелчке на кнопкк, к примеру, сработал сначала обработчик OnClick самой формы. Я пробовал и сообщения ловить и подменять оконную процедуру, но всё по нулям. Помогите, пожалуйста.

Если я привильно понял вопрос то так:
Код


void __fastcall TForm1::FormClick(TObject *Sender)
{
// .......
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    FormClick(this);
    //.......
}

Автор: SenkraD 5.6.2007, 16:22
sp75, так я тоже думал сделать, но а если мне не нужно обрабатывать это событие для какого-то конкретного контрола или у контрола нету такого события, но он своей поверхностью закрывает форму и, как результат, это событие не обрабатывается формой.

Автор: sp75 5.6.2007, 16:29
Цитата(SenkraD @ 5.6.2007,  16:22)
sp75, так я тоже думал сделать, но а если мне не нужно обрабатывать это событие для какого-то конкретного контрола или у контрола нету такого события, но он своей поверхностью закрывает форму и, как результат, это событие не обрабатывается формой.

Нече не понимаю . Лутче вам описать что вы хотите сделать

Автор: SenkraD 5.6.2007, 16:40
Ситуация такова у меня на форме лежатконтролы у которых нет событий мишы, но мне надо что любой щелчёк в пределах формы был обработан.

Автор: Nil 5.6.2007, 16:51
Эммм...Может быть системный хук на мышь ?.. Но это уже похоже на слона из мухи, возможно есть решения проще...

Автор: sp75 5.6.2007, 17:14
Цитата(SenkraD @ 5.6.2007,  16:40)
Ситуация такова у меня на форме лежатконтролы у которых нет событий мишы, но мне надо что любой щелчёк в пределах формы был обработан.

Смотри  Application->OnIdle , думаю поможет, есть хелп в Билдере по OnIdle !

Автор: Vyacheslav 5.6.2007, 17:44
Смотрим 
Код

virtual void __fastcall WndProc(Messages::TMessage &Message);

и
Код

__property Classes::TWndMethod WindowProc = {read=FWindowProc, write=FWindowProc};

Автор: SenkraD 5.6.2007, 17:54
Vyacheslav,  это я в первую очередь пробовал:
Код

//h-файл
TWndMethod OldWndProc;
void __fastcall NewWndProc(TMessage &Msg);

//cpp-файл
// в контрукторе формы пишу так
OldWndProc = WindowProc;
WindowProc = NewWndProc;

// а вот сама обработка
void __fastcall TfrmWaitScreen::NewWndProc(TMessage &Msg)
{
    switch(Msg.Msg)
    {
        case WM_LBUTTONDOWN:
            Close();
            break;

        default:
            OldWndProc(Msg);
            break;
    }
}

но оно так не сработало

Щас проблему почти решил через Application->OnMessage, но тут заминка в том, что сообщение после обработки передаётся контролу на форме, которая лежит под этой формой, а мне это не нужно

Автор: Klin 5.6.2007, 22:56
Че мудрите то smile
Код

 this->OnClick(Application); 


Или я че не понимаю...

А, необходимо для любого контрола smile Тогда примерно так:

Код

void __fastcall TForm1::MyEvent (tagMSG &Msg, bool &Handled) {
 if (Msg.message == WM_LBUTTONDOWN) this->OnClick(Application);
}; // реакция на событие нажатия

. . . . . . 

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Application->OnMessage = MyEvent;
}

Автор: SenkraD 6.6.2007, 09:56
Через Application->OnMessage я щас и делаю. Вот вставляю картинки WaitScreen.jpg и Main.jpg
Как видно на главной форме (Main.jpg) есть три кнопки и вот когда я делаю щелчёк на WaitScreen'е где под ней лежит кнопка, сразу возникает событие OnClick этой кнопки на главной форме. Как от этого избавится?

P.S. Извиняюсь за частичное нарушение правил - одна тема - один вопрос


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)