Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: VCL (C++ Builder) ::  MouseWheelEvent bei TGraphicControl funktioniert nicht     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
JBOpael
Mitglied

Benutzerprofil
Anmeldungsdatum: 07.03.2006
Beiträge: 324
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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.
c++.de :: VCL (C++ Builder) ::  MouseWheelEvent bei TGraphicControl funktioniert nicht   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.