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


Anmelden zum Antworten