Koordinaten innerhalb eines Steuerelement ausgeben
-
Hi, habe zwar wenig C/C++ Erfahrung, aber
meinst du es inetwa so?HWND button; button=GetDlgItem(IDC_MYBUTTON1); HDC dc; dc=GetDC(button); dc->SetViewportOrg(0,0);
-
Ich dachte Du fängst die WM_MOUSEMOVE Nachricht ab.
Damit hast Du auch die Cursoposition. Damit kannst Du überprüfen, ob der Cursor über dem Button ist (WindowRect des Buttons).
Wenn ja, dann brauchst noch die ClientRect und kannst von der Position im Hauptfenster auf die Position im Button umrechnen:bool PointInRect( POINT &pt, RECT &rc ) { return pt.x >= rc.left && pt.x <= rc.right && pt.y >= rc.top && pt.y <= rc.bottom; } ... case WM_MOUSEMOVE: POINT pt; pt.x = LOWORD( lParam ); pt.y = HIWORD( lParam ); RECT rcWindow; GetWindowRect( hButton, &rcWindow ); // hButton = Dein Button if( PointInRect( pt, rcWindow )) { RECT rcClient; GetClientRect( hWnd, &rcClient ); // hWnd = Hauptfenster int x = pt.x - rcClient.left; // x-Koord auf dem Button int y = pt.y - rcClient.top; // y-Koord auf dem Button } return 0; ...EDIT: ehm, benutzt Du MFC ?!
-
Ja in MFC. Wobei ich da wohl oft auch WinAPI reinmixe.
Wie gesagt stehe sehr am Anfang der Programmierung aber
MFC spornt mich mehr an, da man sich an der Oberfläche austoben kann
-
dann brauchst Du die Funktion PointInRect nicht, wenn Du statt RECT CRect benutzt, weil die Klasse hat eine entsprechende Methode (PtInRect).
Das ganze würden dann so aussehen:
CDeinDialog::OnMouseMove(UINT nFlags, CPoint point) { CRect rcWindow; CWnd* pWnd = GetDlgItem( IDC_DEIN_BUTTON ); pWnd->GetWindowRect( &rcWindow ); if( rcWindow.PtInRect( point )) { CRect rcClient; GetClientRect( rcClient ); int x = point.x - rcClient.left; int y = point.y - rcClient.top; } CDialog::OnMouseMove(nFlags, point); }
-
hallo Airdamn,
wenn ich dein Beispiel probiere, wird bei mir der angegebene Button
(IDC_BUTTON1) irgendwie spiegelverkehrt im Dialog erkannt.Der Button befindet sich im oberen linken Bereich der Anwendung.
Fährt die Maus drüber passiert nix. Aber gehe ich unten rechts
in der Anwendung irgendwo hin, gibt er mir ne MessageBox aus die
ich bei dem MouseOver-Ereignis mit eingebunden habe.Muss man das irgendwie invertieren?
-
Egal was ich versuche...weiteres Problem ist, dass ich nie
0,0 auf dem Button erreiche.
-
Ich hab das gleiche Problem hier.

-
sry fürs pushen :p
-
Leite dir eine Klasse vom CButton-Control ab. In deiner eigenen Klasse kannst du dann OnMouseMove behandeln. Diese Koordinaten sollten dann eigentlich korrekt sein.
Grüssli
-
Wenn man das so macht, muss die Klasse vom Button doch von CDialog
abgeleitet sein oder? Nur wird nie MouseMove erreicht, das müsste
man dann ja im MouseMove des Hauptdialog irgendwie umleiten oder wie
würde das gehen?
-
normalerweise geht gar keine WM_MOUSEMOVE Nachricht an den Dialog, wenn der Zeiger über dem Button ist, sondern zum Button. Denn der Button ist auch ein Fenster. Jedes Steuerelement ist ein Fenster.
Du musst deine Klasse von CButton ableiten. Du fügst deinem Button eine Control-Variable zu, wie du es wohl schon gemacht hast und ersetzt das CButton bei der deklaration durch deine eigene Klasse. zb. CMyButton. Oder was auch immer.In deiner von CButton abgeleiteten Klasse, behandelst du dann die WM_MOUSEMOVE Nachricht. Dort drin sollten die Koordinaten dann korrekt sein. Obere linke Ecke des Buttons ist (0,0).
Grüssli