C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: OnMouseLeave и TButton  (Прочитано 3350 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


OnMouseLeave и TButton
« : 07 Декабрь 2014, 21:49:02 »

Можно ли определить событие OnMouseLeave для TButton не создавая при этом нового компонента
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: OnMouseLeave и TButton
« Ответ #1 : 08 Декабрь 2014, 08:05:20 »

Нет.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: OnMouseLeave и TButton
« Ответ #2 : 08 Декабрь 2014, 09:10:46 »

Если имеется в виду не "определить", а обработать событие - то можно.
Определяешь в классе формы:
Код
class TForm1 : public TForm
{
__published:
// ...
 
private:
TWndMethod OldProc;                                    
void __fastcall NewBtnProc(TMessage& msg);
};
 

Далее переопределяем оконную процедуру кнопки (Button1) при создании формы:
Код
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldProc = Button1->WindowProc;        // сохраняем текущую процедуру
Button1->WindowProc = NewBtnProc;  // определяем новую процедуру
}
 

Сама новая процедура обрабатывает сообщения:
Код
void __fastcall TForm1::NewBtnProc(TMessage& msg)
{
switch(msg.Msg) {
case WM_MOUSEMOVE:    // мышь попала в кнопку
CheckBox1->Checked = true;
break;
 
case WM_MOUSELEAVE:   // мышь вышла из кнопки
CheckBox1->Checked = false;
break;
   }
OldProc(msg);  // обрабатываем все другие события
}
 

При желании можно и событие определить без создания компонента. Для этого надо создать класс-потомок от TButton и прописать все вышеуказанное в нем. Например:
Код
// --- определение нового класса-потомка от TButton
 
class PACKAGE TMyButton : public TButton
{
protected:
TWndMethod OldProc;
inline void __fastcall NewBtnProc(TMessage& msg)
{
switch(msg.Msg) {
case WM_MOUSEMOVE:
if(FOnMEnter) FOnMEnter(this);
break;
 
case WM_MOUSELEAVE:
if(FOnMLeave) FOnMLeave(this);
break;
}
OldProc(msg);
}
 
TNotifyEvent FOnMEnter, FOnMLeave;
 
public:
inline __fastcall virtual TMyButton(System::Classes::TComponent* AOwner) :
TButton(AOwner), FOnMEnter(0), FOnMLeave(0)
{
OldProc = WindowProc;
WindowProc = NewBtnProc;
}
inline __fastcall virtual ~TMyButton() { }
 
public:
__property TNotifyEvent OnMEnter = {read=FOnMEnter, write=FOnMEnter};
__property TNotifyEvent OnMLeave = {read=FOnMLeave, write=FOnMLeave};
};
 
// --- указатель на кнопку в классе формы
 
class TForm1 : public TForm
{
__published:
TCheckBox *CheckBox1;
 
private:
TMyButton* MyButton;
void __fastcall BtnMouseEnter(TObject *Sender);
void __fastcall BtnMouseLeave(TObject *Sender);
 
public:
__fastcall TForm1(TComponent* Owner);
};
 
// --- создание кнопки на форме и присвоение обработчиков событий
 
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MyButton = new TMyButton(this);
MyButton->Parent = this;
MyButton->Left = 8;
MyButton->Top = 8;
MyButton->Width = 137;
MyButton->Height = 41;
MyButton->Caption = "New button";
 
MyButton->OnMEnter = &BtnMouseEnter;
MyButton->OnMLeave = &BtnMouseLeave;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnMouseEnter(TObject *Sender)
{
CheckBox1->Checked = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnMouseLeave(TObject *Sender)
{
CheckBox1->Checked = false;
}
 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #3 : 08 Декабрь 2014, 09:39:48 »

Цитата: S0mbre от 08 Декабрь 2014, 09:10:46
Если имеется в виду не "определить", а обработать событие
Ну да именно это я и имел в виду
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #4 : 08 Декабрь 2014, 09:45:13 »

Странно но CheckBox1->Checked = false; не срабатывает
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: OnMouseLeave и TButton
« Ответ #5 : 08 Декабрь 2014, 10:50:41 »

Цитата: Sergey1985 от 08 Декабрь 2014, 09:45:13
Странно но CheckBox1->Checked = false; не срабатывает

что значит не срабатывает?
у тебя он вообще есть?
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #6 : 08 Декабрь 2014, 11:50:42 »

Ну если б не было прога не скомпилилась
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #7 : 08 Декабрь 2014, 11:52:51 »

И вообще любое другое действие не прокатывает.  Такое впечатление что на WM_MOUSELEAVE: вообще никакой реакции нет
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: OnMouseLeave и TButton
« Ответ #8 : 08 Декабрь 2014, 14:00:32 »

Выкладывай проект.
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #9 : 08 Декабрь 2014, 14:04:45 »

//---------------------------------------------------------------------------

#include
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
OldProc = Button1->WindowProc;       
Button1->WindowProc = NewBtnProc; 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NewBtnProc(Messages::TMessage& msg)
{
static int MW = 0;
   switch(msg.Msg) {
      case WM_MOUSELEAVE: 
         Label1->Caption = "Мышка ушла";
         break;
                case WM_NCMOUSEMOVE: 
         Label1->Caption = "WM_NCMOUSEMOVE";
         break;
                       
                case WM_MOUSEMOVE:   
                {
           CheckBox1->Checked = true;
                        Button1->SetFocus();
                }
                        break;
                case  WM_MOUSEWHEEL :
                {
                      MW++;
                      Label1->Caption = IntToStr(MW);
                }
                      break;
    }
   OldProc(msg); 
}


//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
        TButton *Button1;
        TCheckBox *CheckBox1;
        TLabel *Label1;
        TEdit *Edit1;
        void __fastcall FormCreate(TObject *Sender);
private:   // User declarations
        TWndMethod OldProc;
   void __fastcall NewBtnProc(Messages::TMessage& msg);
public:      // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
 
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #10 : 08 Декабрь 2014, 14:29:40 »

Ответ такой
 case WM_MOUSEMOVE:   
                {
           CheckBox1->Checked = true;
                        Button1->SetFocus();
// Вот это надо добавить
                TRACKMOUSEEVENT tme;
                tme.cbSize = sizeof(tme);
                tme.hwndTrack = Button1->Handle;
                tme.dwFlags = TME_LEAVE;
                _TrackMouseEvent(&tme);

                }
 
 
 
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: OnMouseLeave и TButton
« Ответ #11 : 09 Декабрь 2014, 07:14:16 »

Ну не знаю... у меня без этого прекрасно работает! 
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: OnMouseLeave и TButton
« Ответ #12 : 09 Декабрь 2014, 07:19:16 »

Код
case WM_MOUSEMOVE:   
               {                                                     // зачем эти скобки??
          CheckBox1->Checked = true;
                       Button1->SetFocus();
               }                                                    // зачем эти скобки??
                       break;
               case  WM_MOUSEWHEEL :
               {                                                    // зачем эти скобки??
                     MW++;
                     Label1->Caption = IntToStr(MW);
               }                                                    // зачем эти скобки??
                     break;
 

а зачем там эти скобки??
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: OnMouseLeave и TButton
« Ответ #13 : 09 Декабрь 2014, 15:35:57 »

Ну если скобки не поставить то выполнится только одна строчка кода а так все. Все что обрамлены скобками. Или нет? Надо попробовать.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: OnMouseLeave и TButton
« Ответ #14 : 10 Декабрь 2014, 09:14:36 »

Цитата: Sergey1985 от 09 Декабрь 2014, 15:35:57
Ну если скобки не поставить то выполнится только одна строчка кода а так все. Все что обрамлены скобками. Или нет? Надо попробовать.

Скобки там не нужны.
http://en.cppreference.com/w/cpp/language/switch

Нужны только если в каком-то case объявляется новая переменная. Но тогда инструкция break должна входить в область внутри скобок, например:
Код
switch(1) {
   case 1:
  {  
     int x = 0;
     std::cout x '\n';
     break;
   }
   default:
     std::cout "default\n";
     break;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.098 секунд. Запросов: 22.