Wie kann ich ein fenster ohne Titelzeile verschieben ?
Announcement
Collapse
No announcement yet.
Anwendung ohne Titelzeile verschieben
Collapse
X
-
Andreas Kosch hat das in seinem Buch WIN32 Lösungen sehr gut beschrieben. Sehr empfehlenswertes Buch!
procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;
var
rScreenPos : TPoint; //Desktop-Koordinaten von Windows
rClientPos : TPoint; //Fenstern-Koordinaten des Formulares
begin
inherited;
if M.Result = htClient then
begin
rScreenPos.x := M.XPos;
rScreenPos.y := M.XPoy;
rClientPos := ScreenToClient(rScreenPos);
if (rClientPos.y < 30) then
M.Result := htCaption;
end;
end;
Windows wird also einfach vorgegaukelt, dass sich die Maus in einer Fenster-Titelzeile befindet, den Rest übernimmt dann Windows
-
Sorry, das Gleich nochmal formatiert:<p>
procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;<br> var rScreenPos : TPoint; //Desktop-Koordinaten von Windows <br> rClientPos : TPoint; //Fenstern-Koordinaten des Formulares<br> begin<br> inherited;<br> if M.Result = htClient then<br> begin<br> rScreenPos.x := M.XPos;<br> rScreenPos.y := M.XPos;<br> rClientPos := ScreenToClient(rScreenPos);<br> if (rClientPos.y < 30) then<br> M.Result := htCaption;<br> end;<br> end;<p>
Comment
-
Hallöchen,
das da oben ist mir zu kompliziert. Ich habe in die OnMouseMove-Ereignisbehandlungsroutine eines Panels folgenden Code eingefügt, nachdem ich erstmal zwei globale Variablen xf,yf:=Integer deklariert habe:
var P:TPoint;
begin
P.x:=x; // x-Koordinate...
P.y:=y; // ... und y-Koordinate in einem TPoint- // Record speichern...
P:=ClientToScreen(P); // und in globale Koordinaten umwandeln
if Shift=[ssleft] then //wenn linke Maustaste grdrückt, dann...
begin
Form1.Left:=P.x-(xf); //Linken Rand des Formulars auf (aktuelle Zeigerposition)- (Position des Mausklicks innerhalb des Panels) setzen
Form1.Top:= P.y-(yf); //Beim oberen Rand dasselbe machen...
end; //das war's!
end;
In der OnMouseDown-Behandlung habe ich dann noch die aktuelle Klickposition gespeichert:
//...
xf:=X;
yf:=Y;
//...
Viel Erfolg,
Leonhardt(15
Comment
-
Hallo Leonhardt,
dein Beispiel funktioniert natürlich, aber es bildet nicht den Windows-Standard für das Verschieben von Fenstern ab. Da wird nämlich standardmäßig der Fensterinhalt beim Verschieben nicht angezeigt. Wenn du das auch noch einbauen willst, ist die obige Lösung doch einfacher.
Gruß, Uli(45
Comment
-
Ehrlich währt am längsten:
Wenn es auch verjährt ist - ich möchte trotzdem darauf hinweisen!
Die Schummelei des Herrn Kosch zahlt sich nicht aus, wenn das Fenster größer als der Screen ist. Es läßt sich nicht - dauerhaft - beliebig verschieben. Windows will offenbar jedesmal die - nicht vorhandene - Titelzeile wieder ins Blickfeld rücken. Bei der "ehrlichen" Lösung des Leonhardt Wille gibt es da keine Probleme.
Falko Knittel
Comment
Comment