Steuerelemente zur Laufzeit mit der Maus verschieben



  • Ich möchte in meiner Anwendung Steuerelemente verwenden, die frei auf einer Fensterfläche positioniert werden können, indem sie mit der Maus gepackt und verschoben werden.

    Dazu habe ich von CStatic eine Klasse abgeleitet und verarbeite in dieser WM_MOUSEMOVE wie folgt:

    LRESULT CMoveableStatic::OnMouseMove(WPARAM wp, LPARAM lp){
    	CPoint newPoint;
    	newPoint.x = lp & 0x0000FFFF; // Bits 0-15
    	newPoint.y = lp >> 16; // Bits 16-31 
    	if(wp & MK_LBUTTON){ // Linke Maustaste gedrückt --> verschieben
    		// aktuelle Position des Controls bestimmen
    		RECT rect;
    		this->GetWindowRect(&rect);
    		this->GetParent()->ScreenToClient(&rect);
            // Verschiebung bestimmen
    		int dx = newPoint.x - lastPoint.x; 
    		int dy = newPoint.y - lastPoint.y;
            // Control neu positionieren
    		this->SetWindowPos(&wndTop, rect.left+dx, rect.top+dy, 0, 0, SWP_NOSIZE);   
    	}
    	lastPoint = newPoint;
    	return 0;
    }
    

    Prinzipiel funktioniert das, nur während ich die linke Maustaste gedrückt lasse und das Control verschiebe, ist es nicht sichtbar, was nicht schön ist. Und wenn ich die Maus zu schnell bewege, bin ich schneller, als das Steuerelement verschoben wird, und verlasse irgendwann dessen Fläche.

    Ist mein Ansatz generell in Ordnung, oder gibts da ganz andere Herangehensweisen? Ich hab das mal auf ne ähnliche Art in nem .NET Programm gemacht, da war alles schön...



  • dazu gibt es doch eigentlich die Klasse CRectTracker. Beispiele sollten sich im internet sicher finden lassen

    http://msdn.microsoft.com/en-us/library/41731bbw%28v=vs.80%29.aspx


  • Mod

    Und wie unterscheidest Du hier bitte enen normalen Mausklick.
    Ansonsten WM_NCHITTEST mal ansehen und HTCAPTION zurückgeben...
    Evtl. funktioniert das sogar für Child Controls. (Habe ich aber noch nicht probiert)

    Ich persönlich habe solch einen Formulardesigner einmal gebaut mit einem durchsichtigen Fenster übder den Controls in denen ich den schon agesprochenen CRectRacker benutzt habe.


Log in to reply