Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Koordinaten einer Mouse abfangen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
20.04.2007, 12:12 Uhr
~Gastarbeitah
Gast


Guten Tag.
Ich habe da eine Frage, die vielelicht etwas stupide klingt.
Aber, wie kann ich ermittlen, ob sich der Mousezeiger auf einem gemalten Objekt ( Rect, RoundRect, Ellipse, u.s.w. )befindet?
Ich weiss, dass die Koordinaten mit GetMousePos oder per WM_MOUSEMOVE in den Params stecken.Aber weiter komm ich nicht.

Vielleicht weiss ja jemand hier einige Hinweise...
Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.04.2007, 12:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja du kennst ja die position deiner objekte, musste halt dann mit deinen mauskoordinaten abgleichen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.04.2007, 13:17 Uhr
~Gast arbeitet wa
Gast


Danke.

Ja, das weiss ich auch, aber wenn ich mit meiner mouse über den Rand eines Objektes fahre, dann hätte ich in HTML ein hover.
Nur hier, da müsste ich doch bei WM_MOUSEMOVE etwas abfragen,
PSEUDOCODE:

während Mousemove
{
wenn(mouse x grösser linker rand vom Rechteck UND kleiner rechter rand ODER mouse y
grösser oberer Rend vom Recheck UND kleiner untererer rand)
}

Verständlich?
Bei einem Rechteck ist das Möglich, aber wie checke ich das bei, sagen wir mal einer Ellipse?
Das muss doch eleganter gehen, mit Region oder sowas.........
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.04.2007, 13:31 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wenn das Object einfach nur aufgemalt ist dann musst du das selber berechnen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.04.2007, 13:59 Uhr
~Gast-Arbeit-ER
Gast


Selber berechnen?
Mit anderen worten , so wie im Pseudocode-Beispiel?
Aber wie mache ich das denn dann bei ner Ellipse?
Ich meine, da muss ich ja irgendwie n Bereich angeben,der , falls er überscrollt wird, vom Programm registriert wird.
Wie mache ich das; EllipsRgn, oder wie vergleicht man eine Punktemenge mit den GetMousePos-Rückgabewerten?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.04.2007, 22:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja du kannst natürlich eine Region deiner Elipse und eine Region deines Mauspunktes mit Region::Intersect (GDI+) schneiden lassen, wenn das Ergebnis leer (Region::IsEmpty) ist, wurde das Element nicht getroffen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.04.2007, 23:37 Uhr
~Gast arbeitet
Gast


Wenn ich mal die Klassen benutzen würde.
Aber ist WinApi.
Jo, Flo. Wenn ich also laufend bei WM_MOUSEMOVE diese abfrage erstelle ( kar, dass ich ausserhab die Regions des Rechteckes erstellen muss) , also innerhalb WM_MOUSEMOVE den Mousepunkt zu einer Region deklariere und immer wieder abfrage ,ob die beiden eine Schnittmenge bilden, Wenn ja, kann ich den Mouseover erstellen und mit Invalidate Rect das Element umfärben?
SO hatte ich es vor.
Ach nur mal so: N Mousepunkt? Kann man den als Region deklarieren? Dann müsste dr doch mehr als ein Pixel sein, oder?
Danke bisher.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.04.2007, 03:57 Uhr
~Gast am Start
Gast


Habs. Warum sagt mir nicht gleich jemand: du müsstst nach der Funktion
PtInRect() suchen?!!??!
Damit gehts, nur den jeweiligen Punkt gobal deklarieren, am besten das RECT auch, und schon hat man einen Rückgabewert, der fragt: Ist der Punkt in nem Rechteck?
Spitze!
-----------
Aber: in der WM_PAINT zeichne ich ein rechteck, das will ich beim überfahren neu zeichnen, zumindest umfärben.
Und da habe ich mir was ausgedacht:
Trifft PtInRect zu, also True, dann soll SendMessage(hwnd,WM_PAINT,0,1) gesendet werden.
Da W und L param bei WM_PAINT eh unverwendet sind, nehm ich einfach einen als Schalter, zB LParam, und setz ihn =1.
In der WM_PAINT frage ich dann ab, ob der gesetzt ist. Was nicht ist, ausser ich fahr drüber.
Da gibt es einige Fehler.
Will jemand sich den Code ansehen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.04.2007, 09:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


GDI+ ist auch WinAPI, aber halt eben C++ mit Klassen und so

Klar, stimmt PtInRect und Co gibts ja auch noch - wenn man die so selten benutzt denkt man an sowas nicht ;-)

würde aber, wenn du eh schon die Zeichenregionen deiner Objekte hast, einfach PtInRegion benutzen.

Ansonsten sollte man es vermeiden API-Nachrichten mit benutzerdefinierten Parametern aufzurufen, die MS nicht so ausgewiesen hat. Sowas kann leicht schiefgehen, wenn man irgendwo oder wann das nicht mehr so stimmt. Du solltest natürlich in WM_MOUSEMOVE prüfen, und dann ggf deine Parameter neusetzten (Evtl eine Liste deiner Objekte mit ihren Eigenschaften erstellen), dann WM_PAINT abschicken und darin einfach nur neuzeichnen (evtl markierst du einfach nur die Objekte als "changed" die du auch geändert hattest) Natürlich musste da beachten das teilweise ein voller redraw nötig ist, das lässt sich ja einfach feststellen ob die Nachricht von dir kommt oder nicht.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.04.2007, 10:11 Uhr
~GastArbeitetweitah
Gast


Hallo, Flo.
Was auch seltsam ist:
Was in der WM_PAINT geschieht, wird immer wieder ausgeführt, da WM_PAINT ja wuasi bei jedem neuzeichnen gesendet wird.
Und in der WM_CREATE kann ich , egal was ich mach, einfach nichts zeichnen. Egal ob ich mit nem Device context arbeite oder mir einen hole per GetDc.
Kann man in der WM_CREATE überhaupt was malen?
Mir geht es darum:
Ich will ein rechteck haben, welches nicht nur überzeichnet wird, wenn ich drüberfahre, sondern neugezeichnet wird, mit einer neuen Farbe.....
und da kann ich in allen erdenklichen WM_ etwas malen, aber nicht in der WM_CREATE.
Obwohl Kindfester damit locker erstellt werden können.
Wie male ich also in der WM_CREATE ein Rechteck, dass auch bleibt, wennich minimiere , oder verschiebe?`
Ich weiss, es klingt nach basics, aber dahginter bin ich noch nicht gestiegen.
Sorry
Danke schonmal .
Bis dann!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: