| Autor |
Nachricht |
JBOpael
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.03.2006
Beiträge: 324
|
JBOpael Mitglied
10:20:31 13.03.2012 Titel: |
MouseWheelEvent bei TGraphicControl funktioniert nicht |
Zitieren |
Hallo zusammen,
ich erstelle gerade eine Komponente die ich von TGraphicControl abgeleitet habe.
Auf dem GraphicControl würde ich jetzt gerne das Mouserad verwenden. Leider funktioniert nichts um das Event ab zu fangen.
1. Versuch: Vorhandene OnMouseWheel funktion nutzen:
| C++: | 1 2 3 4 5 6 7 8 9 | __fastcall void MouseWheel(System::TObject* Sender, Classes::TShiftState Shift, int WheelDelta, const Types::TPoint &MousePos, bool &Handled);
//im Konstruktor
this->OnMouseWheel=MouseWheel;
void __fastcall TMyGraphic::MouseWeeel(System::TObject* Sender, Classes::TShiftState Shift, int WheelDelta, const Types::TPoint &MousePos, bool &Handled)
{
ShowMessage("Wheel");
} | |
2. Versuch: Mouse Nachricht abfangen:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | void __fastcall TMyGraphic::WndProc(Messages::TMessage &Message)
{
switch(Message.Msg)
{
case WM_LBUTTONUP:
ShowMessage("L Button"); // Funktioniert
break;
case WM_MOUSEWHEEL:
ShowMessage("Mouse Wheel");
break;
}
} | |
Bin für jede Hilfe Dankbar |
|
|
|
 |
audacia
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.02.2005
Beiträge: 4149
|
audacia Mitglied
17:19:05 13.03.2012 Titel: |
|
Zitieren |
Ich vermute mal, daß du von TWinControl erben mußt, weil die Windows und/oder die VCL solche Nachrichten nur an Controls mit Window-Handle weiterleitet. |
_________________ "Hey, it compiles! Ship it!"
C++Builder Pages · Typsichere Format-Strings
|
|
 |
DerAltenburger
Mitglied
Benutzerprofil
Anmeldungsdatum: 22.02.2003
Beiträge: 1575
|
DerAltenburger Mitglied
20:40:55 15.03.2012 Titel: |
|
Zitieren |
| audacia schrieb: | | Ich vermute mal, daß du von TWinControl erben mußt, weil die Windows und/oder die VCL solche Nachrichten nur an Controls mit Window-Handle weiterleitet. |
Genau das Problem gatte ich auch. Von WinControl wollte ich aber nict erben, da die Komponente transparent sein muss.
Eine Lösung:
in Komponnente eine geeignete DoWheel- Methode einbauen
in Hauptform den MousWheelHandler nutzen (der wird gerufen!)
darin checke ich die Mouse- Position, ob die in der Komponente liegt
Wenn ja: die DoWheel- Methode rufen.
Klappt bei mir problemlos - mache das auch mit Kompos, die von WinControl abstammen. Dann reagiert immer die Komponente, über der die Maus steht!
Gruss
Frank |
_________________ Hilfreich beim Programmieren:
ZUERST Hirn einschalten!
( WWW.DerAltenburger.de )
|
|
 |
audacia
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.02.2005
Beiträge: 4149
|
audacia Mitglied
00:03:23 16.03.2012 Titel: |
|
Zitieren |
Ist halt ziemlich dirty, wenn man die Sache eigentlich in eine Komponente auslagern wollte.
Vermutlich kann man den Workaround auch systematisch anwenden, indem man das Window-Handle des nächsten Parents, das eins hat, subclasst. |
_________________ "Hey, it compiles! Ship it!"
C++Builder Pages · Typsichere Format-Strings
|
|
 |
JBOpael
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.03.2006
Beiträge: 324
|
JBOpael Mitglied
15:57:10 16.03.2012 Titel: |
|
Zitieren |
Danke für die Infos,
sieht ja ziemlich schlecht für mich aus.
Ich muss von TGraphicControl ableiten weil das meiner Meinung nach am besten als Zeichenunterlage geeignet ist.
das DoWheel von der übergeordneten komponente zu holen ist zu mindestens schonmal eine Lösung auch wenn die nicht schön ist.
Hmm... Alternativ bleibt mir halt nur auf das Mausrad zu verzichten. ich wollte eignelich einen Zoom damit realisieren. |
|
|
|
 |
audacia
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.02.2005
Beiträge: 4149
|
audacia Mitglied
17:58:57 16.03.2012 Titel: |
|
Zitieren |
| JBOpael schrieb: | | Ich muss von TGraphicControl ableiten weil das meiner Meinung nach am besten als Zeichenunterlage geeignet ist. | Ist das der einzige Grund? Sonst würde ichs doch mal mit TWinControl versuchen.
Ansonsten kannst du dich ja mal ans Subclassing wagen. |
_________________ "Hey, it compiles! Ship it!"
C++Builder Pages · Typsichere Format-Strings
|
|
 |
JBOpael
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.03.2006
Beiträge: 324
|
JBOpael Mitglied
17:00:30 19.03.2012 Titel: |
|
Zitieren |
Hmm... Kann mir denn jemand sagen wie ich an Canvas komme wenn ich von TWinControl ableite? |
|
|
|
 |
DocShoe
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.04.2008
Beiträge: 1827
|
DocShoe Mitglied
18:11:24 19.03.2012 Titel: |
|
Zitieren |
TWinControl hat kein Canvas als Member, du kannst aber im OnPaint Ereignishandler ein TCanvas Objekt an ein Handle "kleben":
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 | void TMyWinControl::OnPaint( TMessage& msg )
{
// PAINTSTRUCT initialisieren
PAINTSTRUCT ps;
TCanvas* Canvas = new TCanvas();
Canvas->Handle = ::BeginPaint( Handle, &ps );
// Canvas benutzen
// PAINTSTRUCT freigeben
::EndPaint( Handle, &ps );
} | |
Dazu musst du aber noch einen Ereignis Handler für die WM_PAINT Nachricht für dein Control registrieren (BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP).
Edit:
Oder einen weiteren switch für WM_PAINT in die WndProc einbauen |
_________________ Die fünf häufigsten Anzeichen für Faulheit:
1.
Zuletzt bearbeitet von DocShoe am 18:20:34 19.03.2012, insgesamt 1-mal bearbeitet |
|
 |
JBOpael
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.03.2006
Beiträge: 324
|
JBOpael Mitglied
09:35:49 20.03.2012 Titel: |
|
Zitieren |
Danke für eure Hilfe.
Also um die ganze Canvas Geschichte etwas zu vereinfachen habe ich nach etwas längerem Googlen raus gefunden das es sinnvoller ist von von TCustomControl ab zu leiten. Da steht TWinControl drüber und Canvas ist Implementiert.
Jetzt komm ich wieder zu meinem eigentlichem Problem. Das MouseWheelEvent reagiert auch nicht bei TWinContol oder bei TCustomControl.
Auch bei Tastatureingaben kommt nichts durch (WM_KEYUP,WM_KEYDOWN). Kann es sein das das Objekt irgendwie den Fokus haben muss? |
|
|
|
 |
VergissEs
Mitglied
Benutzerprofil
Anmeldungsdatum: 28.06.2001
Beiträge: 1041
|
VergissEs Mitglied
10:06:01 20.03.2012 Titel: |
|
Zitieren |
Habe auch eine Komponente abgeleitet von TCustomControl um MouseWheel abzufangen
Ich verwende dabei folgende ControlStyles:
| C++: | | ControlStyle = ControlStyle << csOpaque << csCaptureMouse << csAcceptsControls << csClickEvents << csDoubleClicks << csReflector; | | |
_________________ MfG
VergissEs
|
|
 |
JBOpael
Mitglied
Benutzerprofil
Anmeldungsdatum: 07.03.2006
Beiträge: 324
|
JBOpael Mitglied
10:23:32 20.03.2012 Titel: |
|
Zitieren |
Das war es Tatsächlich.
im WM_LBUTTONUP einfach SetFocus() aufrufen und schon funktioniert alles. |
|
|
|
 |