Zdarzenie
OnMouseDown jest wywoływane gdy wciskamy klawisz myszy do dołu, zdarzenie
OnMouseUp jest wywoływane gdy zwalniamy klawisz klawisz myszy do góry, zdarzenie
OnMouseMove jest wywoływane gdy przesuwamy wskaźnik myszy nad obiektem, zdarzenie
OnClick jak widaomo oznacza kliknięcie w obiekt, czyli jest jakby połączeniem dwóch zdarzeń
OnMouseDown + OnMouseUp. W nowszych wersjach środowiska C++ BUilder występuje dodatkowo zdarzenie
OnMouseLeave wywoływane gdy wskaźnik opuszcza obiekt i jest przeciwieństwem zdarzenia
OnMouseMove.
Co do Twojego pierwszego pytania, to zadanie może być zrealizowane tylko w zdarzeniach OnMOuseMove i OnMouseLeave, czyli w zdarzeniu OnMouseMove przypisujesz właściwości Caption jakąś wartość:
- Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Label1->Caption = reinterpret_cast<TControl *>(Sender)->Name;
}
W zdarzeniu OnMouseLeave wpisujesz inny tekst:
- Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseLeave(TObject *Sender)
{
Label1->Caption = "Text";
}
Zamiast zdarzenia OnMouseMove możesz użyć zdarzenie
OnMouseEnter:
- Kod: Zaznacz cały
void __fastcall TForm1::Panel1MouseEnter(TObject *Sender)
{
Label1->Caption = reinterpret_cast<TControl *>(Sender)->Name;
}
Zdarzeniem przeciwnym do OnMouseEnter jest OnMouseLeave, jeżeli nie masz zdarzenia OnMouseEnter to musisz skorzystać z OnMouseMove, jeżeli nie masz również zdarzenia OnMouseLeave to musisz stworzyć procedurę, która je zastąpi:
w pliku nagłówkowym np. Unit1.h:
- Kod: Zaznacz cały
private:
TWndMethod PanelLeave; // nazwa dowolna
void __fastcall MousePanelLeave(TMessage &Msg); // nazwa dowolna
w pliku źródłowym np. Unit1.cpp:
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) // konstruktor klasy
: TForm(Owner)
{
PanelLeave = Panel1->WindowProc;
Panel1->WindowProc = MousePanelLeave;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MousePanelLeave(TMessage &Msg)
{
if(Msg.Msg == CM_MOUSELEAVE)
Label1->Caption = "Text";
PanelLeave(Msg);
}
//---------------------------------------------------------------------------
Jeżeli chcesz wykorzystać zdarzenie OnMouseMove więcej niż w jednym obiekcie, czyli nie tylko w obiekcie Panel1 to możesz wykorzystać sposób z przypisaniem polimorficznym opisanym na początku artykułu
w serwisie Cyfrowy
Baron
Rzutowanie typów, przypisanie polimorficzne, łącząc ze sobą obiekty poprzez zdarzenia. przy czym nie musisz niczego więcej wpisywać w zdarzenie OnMouseMove obiektu Panel1 gdyż zastosowałem tam rzutowanie polimorficzne do pobrania nazwy obiektu, tak więc po połączeniu przez to zdarzenie kliku innych obiektów, będą zwracane nazwy tychże obiektów.
Niestety, jeżeli nie dysponujesz zdarzeniem OnMouseLeave, to nie możesz tutaj wykorzystać przypisania polimorficznego do obsługi kliku kilku obiektów za pomocą jednej metody WindowProc. Prawdopodobnie można by to jakoś zrobić, ale teraz nic nie przychodzi mi do głowy.
Jeżeli dysponujesz zdarzeniem OnMOuseLeave to możesz wykorzystać przypisanie polimorficzne tak samo jak w zdarzeniu OnMouseMove.