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
-
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.