Mit MOUSEMOVE Position von RECT aendern - Problem - Anfaenger
-
Ich will mit Nachricht MOUSEMOVE Position von einem RECT aendern (etwas zu "ziehen").
Ich habe POINT start und POINT end, um die Koordinaten, wo man WM_LBUTTONDOWN macht (start), und, wohin man "zieht"(end), zu speichern.
Man kann ziehen nur dann, wenn man mit WM_LBUTTONDOWN in Bereich von Rect drueckt.
Problem ist: wie man rechnet neue Koordinaten von RECT? (ich brauche nur ein Punkt: rect.left und rect.top. Andere 2 Parameter werden automatisch berechnet.
Ich habe so geschrieben:
rect.left+=end.x-start.x;
rect.top+=end.y-start.y;
Das heisst, zum alten Wert von rect.left addiere ich die Differenz zwischen Punkt, wohin ich ziehe, und Punkt, wo ich gedrueckt hat.
Aber das funktioniert nicht: mein Rect fliegt weit weit weg, viel weiter, als Mouse sich bewegt.
Interessant ist, dass, wenn ich so schreibe:
rect.left=end.x;
dann funktioniert alles bestens, aber Mouse liegt immer im Punkt (rect.left;rect.top) vom RECT.
Wo liegt Fehler oder villeicht gibts andere Loesung dieses Problems?
Hier ist meine Code von WndProc:LRESULT CALLBACK WinProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) { char text[]="Blood Mary"; static RECT rect; static POINT start; static POINT end; SIZE size; // Main SWITCH------------------------------------------------------------------ switch (Message) { case WM_CREATE: { start.x = -1; start.y = -1; end.x = -1; end.y = -1; return 0; } case WM_LBUTTONDOWN: { int xpos=LOWORD(lparam); int ypos=HIWORD(lparam); if ((rect.left<=xpos)&&(xpos<=rect.right)&&(rect.top<=ypos)&&(ypos<=rect.bottom)) { start.x=xpos; start.y=ypos; } return 0; } case WM_MOUSEMOVE: { if ((wparam & MK_LBUTTON)&&start.x!=-1) { end.x=LOWORD(lparam); end.y=HIWORD(lparam); InvalidateRect(hwnd,NULL,TRUE); } return 0; } case WM_LBUTTONUP: { start.x=-1; return 0; } case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc=BeginPaint(hwnd,&ps); GetTextExtentPoint32(hdc,text,strlen(text),&size); if (start.x!=-1) { rect.left=(end.x-start.x+rect.left); rect.top=(end.y-start.y+rect.top); } else { rect.left=100; rect.top=50; } rect.right=rect.left+size.cx; rect.bottom=rect.top+size.cy; DrawText(hdc,text,strlen(text),&rect,DT_CENTER|DT_VCENTER); EndPaint(hwnd, &ps); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } default: return DefWindowProc(hwnd, Message, wparam, lparam); } // END of Main SWITCH------------------------------------------------------------ return 0; }


-
vadimiron schrieb:
rect.left=end.x;
dann funktioniert alles bestens, aber Mouse liegt immer im Punkt (rect.left;rect.top) vom RECT.Das sieht auch schon viel besser aus - was du allerdings mit dem 2. Teil des Satzes sagen willst, habe ich nicht ganz verstanden

-
flenders schrieb:
vadimiron schrieb:
rect.left=end.x;
dann funktioniert alles bestens, aber Mouse liegt immer im Punkt (rect.left;rect.top) vom RECT.Das sieht auch schon viel besser aus - was du allerdings mit dem 2. Teil des Satzes sagen willst, habe ich nicht ganz verstanden

Ich habe versucht damit zu sagen, dass RECT sich bei WM_MOUSEMOVE so verlagert, dass MouseZeiger sich im linken oberen Punkt vom RECT befindet, ganz egal ob ich in der Mitte vom RECT gedrueckt habe oder unten rechts; und das ist selbstverstaendlich, weil ich so: rect.left=end.x;-schreibe.
Aber ich will, wenn ich zB in die Mitte vom RECT druecke, dass MouseZeiger auch beim Ziehen (bei WM_MOUSEMOVE) da bleibt. Dafuer versuchte ich so was zu schreiben: rect.left=(end.x-start.x+rect.left);. zum alten Wert vom rect.left addiere ich Abstand zwischen end.x und start.x
Aber das funktioniert nicht richtig.
-
Evtl. hilft dir das:
http://www.geeky.de/cpp/downloads/test_rect.rar
(Ist eine Beispielanwendung, bei der man ein Rechteck mit Text drin ziehen kann, und anschließend verschieben...)
-
geeky schrieb:
Evtl. hilft dir das:
http://www.geeky.de/cpp/downloads/test_rect.rar
(Ist eine Beispielanwendung, bei der man ein Rechteck mit Text drin ziehen kann, und anschließend verschieben...)Vielen Dank

Das hat geholfen
Wer sich interessiert, mein Code muss man so ergaenzen:
Nach
rect.left=(end.x-start.x+rect.left);
rect.top=(end.y-start.y+rect.top);
soll man noch das schreiben:
start.x=end.x;
start.y=end.y;
weil start muss beim nächsten WM_MOUSEMOVE der jetzige Punkt sein und der jetzige Punkt ist immer end