Mausbewegungen über einem Steuerelemt abfangen!!
-
Hallo,
bräuchte mal einen Tip zur Vorgehensweise.
In einer dialogfeldbasierenden Anwendung sind unterschiedliche Steuerelemte platziert. Befindet sich der Mauszeiger über einem Element, so soll in einem nebenstehenden Textfeld eine kurze Beschreibung angezeigt werden.Wie geht man da am Besten vor? Wie fange ich das Ereignis ab, dass sich der Mauszeiger über einem Steuerelemt befindet?
Über Tipps und Ratschläge wäre ich echt dankbar.
Gruss
Stefan
-
Hi, hast du schon versucht mit der OnMouseMove funktion zu arbeiten?
Du must da eigentlich nur die x und y position abfragen.
Wenn du weite fragen hast kannst dich auch gerne an mich privat wenden ich versuche zu helfen so weit ich kann!
mfg Govedar
-
Am besten wäre, wenn du dir einen Timer baust der jede Sekunde die Position der Maus holt und dann mit PtInRect() abfragt, ob die Maus über dem Control ist oder nicht. Dazu musst du noch mit OnMouseMove arbeiten.
Gruß
:: NoName ::
-
Hallo,
Stefan H schrieb:
Wie geht man da am Besten vor?
siehe einfach:
http://support.microsoft.com/kb/135873/en-us
MfG
-
Werde jetzt mal versuchen was machbar ist......
Danke
Stefan
-
:: NoName :: schrieb:
Am besten wäre, wenn du dir einen Timer baust der jede Sekunde die Position der Maus holt und dann mit PtInRect() abfragt, ob die Maus über dem Control ist oder nicht. Dazu musst du noch mit OnMouseMove arbeiten.
Gruß
:: NoName ::Mit Timer wäre wohl so ziemlich das genaue Gegenteil von "am besten"...
-
dEUs schrieb:
Mit Timer wäre wohl so ziemlich das genaue Gegenteil von "am besten"...
´
Und warum wenn ich fragen darf? Gegen ein Timer ist nichts einzuwenden.
Natürlich kann man auch TRACKMOUSEEVENT verwenden...Gruß
:: NoName ::
-
Weil es einfach sinnlos ist. Du hast ja bereits die zwei Lösungen genannt, die man dafür verwenden sollte.
-
ich muss mir von meinen Steuerelementen immer über GetWindowRect() die Koordinaten holen. Danach diese mit ClientToScreen () umwandeln und dann mit ner if-Anweisung abfragen ob die Maus über einem Steuerelement ist, oder?
So weit richtig?Vielleicht hat jemand von euch mal ein bisschen Code zur Veranschaulichung...dann finde ich mit Sicherheit auch meinen Fehler und muss hier nicht noch länger "dumme" Fragen stellen.
Danke für Eure Mithilfe.
Gruss
Stefan
-
@ dEUS
Sollte oder kann? Beides Funktioniert und erfüllt seinen Zweck.
Das hier ist genau was ich meine...
http://www.codeproject.com/miscctrl/subclassdemo.asp@ Stefan
Du solltest aber ScreenToClient() benutzen, nicht ClientToScreen()
Schau dir am besten einfach den Link an...Gruß
:: NoName ::
-
dazu noch eine Frage:
In dem Beispiel wird jetzt ein SubClass von CButton erstellt um das Ereignis abzufangen.
OK, ich benötige dies allerdings nicht nur für Buttons, sondern für ChkBoxen, Listenfelder, Komboboxen, etc. .....!
Sehe ich das jetzt richtig, dass ich in diesem Fall dann für jede Art von Steuerelement eine Subclass erstellen muss????So, erstmal Danke für den Link. Vielleicht blicke ichs ja doch noch irgendwann....
DANKE.
Stefan
-
Ja, so kann man's sagen. Aber nur wenn du auch wirklich immer eine Klasse ableiten willst [was natürlich die saubere Methode ist].
Du kannst aber auch gleich dein ganzes Programm im XP-Style machen.
Dazu brauchst du nur diesen Code:
http://www.codeproject.com/w2k/xptheme.aspGruß
:: NoName ::
-
Hallo,
Danke für den Link. Werde das jetzt mal ausprobieren.
Da ich in meiner Anwendung mehrere (eigentlich schon fast viele) Unterdialoge mit unterschiedlichen Steuerelementen habe, fällt die Variante des "SubClassen" glaube ich schon mal weg.Im Netz habe ich noch einen weiteren (für mich leider unverständllichen) Hinweis gefunden. Vielleicht kannst ja Du damit etwas anfangen.
"....wenn man nicht subclassen will...dann die PreTranslateMessage der Anwendung überschreiben und die HWND´s vergleichen....."Wäre cool wenn Du mir dieses Vorgehen mal erklären könntest. Vielleicht bringt mich das ja weiter.
Super vielen Dank.
Gruss
Stefan
-
Hi,
diese XP-Theme-Geschichte funktioniert ja nur bei XP als Betriebssystem. Leider verwende ich hier noch Windows2000.Ausserdem verstehe ich nicht ganz wie das XP-Theme mit meinem Problem zusammenhängt?!? Ist es in dieser Art dann nicht notwendig die einzelnen S-Elemente zu subclassen?!?
Der Tag nach Rosenmontag....wie ich den liebe!
Gruss
Stefan
-
Stefan, das mit dem Subclassen ist gar nicht so schlimm, wie es zuerst scheint.
Ich habe bei meiner Anwendung auch für so ziemlich jedes Formularelement eine eigene Klasse - das Nachziehen ist etwas mühselig, aber danach heben die Vorteile den Zeitnachteil auf.
-
Danke für die Aufmunterung....
dann werde ich mich eben jetzt mal ans "subclassen" machen......!Irgendwie schon komisch, dass dies die einzige Möglichkeit darstellt um das zu realisieren!
Egal, dann nochmals Danke.
Gruss
Stefan
-
BOOL MyDlg::PreTranslateMessage(MSG* pMsg) { int nID[7]; nID[0] = IDC_MYCONTROL_1; nID[1] = IDC_MYCONTROL_2; nID[2] = IDC_MYCONTROL_3; nID[3] = IDC_MYCONTROL_4; nID[4] = IDC_MYCONTROL_5; nID[5] = IDC_MYCONTROL_6; nID[6] = IDC_MYCONTROL_7; //wurde die mouse bewegt? if(pMsg->message == WM_MOUSEMOVE) { for(int i = 0; i < 6; i++) { if(pMsg->hwnd == GetDlgItem(nID[i])->m_hWnd) { //und schon weisst du Bescheid... :D
-
DANKE, genau so habe ich mir das vorgestellt.
In einem einfachen Hauptdialog funktionierts einwandfrei.In meiner Anwendung jedoch wird über einen Button im Hauptdialog ein Unterdialog geöffnet. In diesem Unterdialog soll dann die PreTranslateMessage greifen.
Sobald ich dann meinen Mauszeiger vom Hauptdialog in den Unterdialog bewege stürzt das Programm ab.
Das muss dann an diesem m_hwnd liegen, oder?
Muss das noch auf den Unterdialog angepasst werden?Aber erstmal Danke für die Hilfe.
Gruss
Stefan
-
Hallo,
die Vorgehensweise von q150022 funktioniert im Hauptdialog ohne Probleme.
Allerdings bekomme ich bei der PreTranslateMessage-Funktion in meinem Unterdialog (Abgeleitet von CDialog) immer folgende Fehlermeldung:--Nicht abgefangene Ausnahme in ProtADMA.exe: 0xC0000005: Access Violation.--
Woran liegt das?
Implementiere ich die PreTranslateMessage-Funktion im Hauptdialog kann ich nicht auf die einzelnen Steuerelemente des Unterdialoges zuzugreifen.Vielleicht hat ja noch jemand einen Tipp.
DANKE.
Gruss
Stefan
-
Dein "Unter"-Dialog sollte vorher den Focus erhalten. Wie gesagt, das ist nur so eine Idee. Gib in der PreTranslateMessage-Funktion folgende Anweisung ein:
this->SetFocus();
...und anschließend den Code wie vorher beschrieben.
Viel Erfolg