Wenn Sie Grafik- oder Multimediaanwendungen entwickeln, fragen Sie sich möglicherweise, wie Sie ein Formular verschieben können, ohne die Titelleiste zu verwenden. Tatsächlich müssen Sie nur den Clientbereich des Formulars mit der Maus ziehen.
Methode eins
Das Folgende ist die gebräuchlichste Methode, um die obige Funktion auszuführen: Fügen Sie die folgende Prozeduranweisung im Abschnitt „PRivate-Anweisung“ des Formulars hinzu:
procedure WMNCHitTest(var Msg:TWMNCHitTest);message WM_NCHITTEST;
Fügen Sie dann den folgenden Code im Implementierungsabschnitt hinzu:
procedure TForm1{oder der von Ihnen definierte Formularname}.WMNCHitTest(var Msg:TWMNCHitTest);
beginnen
DefaultHandler(Msg);
wenn Msg.Result = HTCLIENT dann
Msg.Result:= HTCAPTION;
Ende;
Diese Methode lässt Windows denken, dass auf die Titelleiste geklickt wurde, wenn die Maus auf den Clientbereich des Formulars klickt.
Methode zwei
Hier ist eine weitere Möglichkeit, eine Normalform mit der Maus zu verschieben.
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
beginnen
if (ssLeft in Shift) then begin
ReleaseCapture;
SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
Ende;
Ende;
Unvollkommenheiten der oben genannten Methoden
Sehen wir uns an, was passiert, wenn die Option „Fensterinhalt beim Ziehen anzeigen“ deaktiviert ist. Dies ist eine Einstellung für Windows-Fenster. Sie finden diese Eigenschaft unter „Startmenü -> Einstellungen -> Ordneroptionen -> Ansicht -> Erweiterte Einstellungen“. Unter Windows95 müssen Sie die Registrierung ändern. Wenn diese Eigenschaft auf ungültig gesetzt ist, ändert sich das Formular beim Ziehen in einen quadratischen Umriss. Vielleicht verwenden Sie eine unregelmäßige Form, aber sie zeigt immer noch Umrisse.
Wenn Sie möchten, dass Ihr Formular am Rand des Bildschirms angedockt wird (z. B. WinAmp: Wenn Sie das Formular an eine bestimmte Position am oberen Bildschirmrand ziehen, befindet sich das Formular nahe am oberen Bildschirmrand), wenn Sie verwenden den zweiten Schritt oben. Auf diese Weise können Sie die Formularposition erst bearbeiten, wenn die Maustaste losgelassen wird, und Sie können keine Andockprobleme lösen.
Im Folgenden werde ich einfache Methoden verwenden, um zwei Probleme zu lösen:
Erstens wird der Umriss beim Ziehen des Formulars unabhängig von der Einstellung nicht angezeigt.
Zweitens wird die Positionserkennung durchgeführt, wenn das Formular verschoben wird, und es wird an einer bestimmten Stelle angedockt, wenn die Position geeignet ist.
Viele Leute haben diese Probleme vielleicht gelöst, aber vielleicht hilft Ihnen der folgende Code.
Methode drei
Der folgende Code kann direkt in Delphi kopiert werden, vorausgesetzt, Sie speichern Form1 als uMain.pas und Form2 als uDock.pas. Die verwendeten Ereignisse sind: OnMouseDown, OnMouseMove, OnMouseUp, OnShow (Form1).
Dies ist eine Methode zum Verschieben eines Formulars basierend auf der Mausbewegung, einschließlich zweier Formulare, uMain und uDock (Form1 und Form2). Form2 wird über Form1 geöffnet und kann am unteren Rand von Form1 angedockt werden. Sobald Form2 angedockt ist, bewegt er sich mit Form1, bis Sie Form2 aus dem Weg räumen.
Formular1
Einheit uMain;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge;
Typ
TForm1 = Klasse(TForm)
procedure FormMouseDown(Sender:TObject; Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState;X,Y: Integer);
procedure FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
procedure FormShow(Sender: TObject);
Privat
{Private Erklärungen}
öffentlich
DocktoForm: Boolean;
{Öffentliche Erklärungen}
Ende;
var
Form1: TForm1;
CanMove, CanMoveX, CanMoveY: Boolean;
OldX, OldY: Ganzzahl;
F1X,F1Y,F2X,F2Y: Ganzzahl;
Arbeitsbereich: TRect;
Durchführung
verwendet uDock;
{$R *.DFM}
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
beginnen
CanMoveX := true;
CanMoveY := true;
CanMove := true;
OldX := X;
OldY := Y;
ifDocktoForm dann
beginnen
F1X := Form1.Left;
F1Y := Form1.Top;
F2X := Form2.Left;
F2Y := Form2.Top;
Ende;
Ende;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
beginnen
if (CanMove) then
beginnen
wenn CanMoveX dann
Form1.Left := Form1.Left + (X - OldX);
wenn CanMoveY dann
Form1.Top := Form1.Top + (Y - OldY);
//Dieser Abschnitt rastet oben ein
if (Form1.Top < WorkArea.Top + 10) und (Form1.Top > WorkArea.Top-10) dann
beginnen
Form1.Top := WorkArea.Top;
wenn (Y-OldY > 10) oder (Y-OldY < -10), dann
CanMoveY := wahr
anders
CanMoveY := False;
Ende;
//Dieser Abschnitt wird auf der linken Seite verriegelt
if (Form1.Left < WorkArea.Left+10) und (Form1.Left > WoskArea.Left-10) dann
beginnen
Form1.Left := WorkArea.Left;
wenn (X-OldX > 10) oder (X-OldX < -10), dann
CanMoveX := wahr
anders
CanMoveX := False;
Ende;
//Dieser Abschnitt wird auf der rechten Seite verriegelt
if (Form1.Left > WorkArea.Right-Form1.Width-10) und (Form1.Left < WorkArea.Right-Form1.Width+10) dann
beginnen
Form1.Left := WorkArea.Right-Form1.Width;
wenn (X-OldX > 10) oder (X-OldX < -10), dann
CanMoveX := wahr
anders
CanMoveX := False;
Ende;
//Dieser Abschnitt wird mit der TaskBar verknüpft
ifDocktoForm dann
beginnen
if (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) und (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10) dann
beginnen
Form1.Top := WorkArea.Bottom-Form1.Height-Form2.Height;
wenn (Y-OldY > 10) oder (Y-OldY < -10), dann
CanMoveY := wahr
anders
CanMoveY := False;
Ende;
Ende
sonst beginnen
if (Form1.Top > WorkArea.Bottom-Form1.Height-10) und (Form1.Top < WorkArea.Bottom-Form1.Height+10) dann
beginnen
Form1.Top := WorkArea.Bottom-Form1.Height;
wenn (Y-OldY > 10) oder (Y-OldY < -10), dann
CanMoveY := wahr
anders
CanMoveY := False;
Ende;
Ende;
ifDocktoForm dann
beginnen
Form2.Left := Form1.Left - (F1X-F2X);// + (X-OldX);
Form2.Top := Form1.Top+Form1.Height;
Ausfahrt;
Ende;
//Dieser Abschnitt speichert die Wiedergabeliste in der Mitte von Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) und (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) und
(Form2.Top > Form1.Top+Form1.Height-10) und (Form2.Top < Form1.Top+Form1.Height+10) dann
beginnen
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
DocktoForm := True;
F1X := Form1.Left;
F1Y := Form1.Top;
F2X := Form2.Left;
F2Y := Form2.Top;
Ende;
Ende;
Ende;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
beginnen
CanMove := false;
Ende;
procedure TForm1.FormShow(Sender: TObject);
beginnen
//Arbeitsbereichsparameter abrufen
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
Form2.Show;
Ende;
Ende.
Form2
Einheit uDock;
Schnittstelle
verwendet
Windows, Nachrichten, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge;
Typ
TForm2 = Klasse(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
Privat
{Private Erklärungen}
öffentlich
{Öffentliche Erklärungen}
Ende;
var
Form2: TForm2;
CanMove, CanMoveX, CanMoveY, DocktoForm: Boolean;
OldX, OldY: Ganzzahl;
Durchführung
verwendet uMain;
{$R *.DFM}
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
beginnen
CanMoveX := true;
CanMoveY := true;
CanMove := true;
OldX := X;
OldY := Y;
Ende;
procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
beginnen
if (CanMove) then
beginnen
wenn CanMoveX dann
Form2.Left := Form2.Left + (X - OldX);
wenn CanMoveY dann
Form2.Top := Form2.Top + (Y - OldY);
//Dieser Abschnitt rastet oben ein
if (Form2.Top < WorkArea.Top + 10) und (Form2.Top > WorkArea.Top-10) dann
beginnen
Form2.Top := WorkArea.Top;
wenn (Y-OldY > 10) oder (Y-OldY < -10), dann
CanMoveY := wahr
anders
CanMoveY := False;
Ende;
//Dieser Abschnitt wird auf der linken Seite verriegelt
if (Form2.Left < WorkArea.Left+10) und (Form2.Left > WorkArea.Left-10) dann
beginnen
Form2.Left := WorkArea.Left;
wenn (X-OldX > 10) oder (X-OldX < -10), dann
CanMoveX := wahr
anders
CanMoveX := False;
Ende;
//Dieser Abschnitt wird auf der rechten Seite verriegelt
if (Form2.Left > WorkArea.Right-Form2.Width-10) und (Form2.Left < WorkArea.Right-Form2.Width+10) dann
beginnen
Form2.Left := WorkArea.Right-Form2.Width;
wenn (X-OldX > 10) oder (X-OldX < -10), dann
CanMoveX := wahr
anders
CanMoveX := False;
Ende;
//Dieser Abschnitt wird mit der TaskBar verknüpft
if (Form2.Top > WorkArea.Bottom-Form2.Height-10) und (Form2.Top < WorkArea.Bottom-Form2.Height+10) dann
beginnen
Form2.Top := WorkArea.Bottom-Form2.Height;
wenn (Y-OldY > 10) oder (Y-OldY < -10), dann
CanMoveY := wahr
anders
CanMoveY := False;
Ausfahrt;
Ende;
//Dieser Abschnitt wird an der Unterseite des Players befestigt
if (Form2.Top > Form1.Top+Form1.Height-10) und (Form2.Top < Form1.Top+Form1.Height+10) und (Form2.Left > Form1.Left-Form2.Width) und (Form2. Left < Form1.Left + Form1.Width).
beginnen
Form2.Top := Form1.Top+Form1.Height;
Wenn (Y-OldY > 10) oder (Y-OldY < -10), dann beginnen
CanMoveY := true;
Form1.DockToForm := False;
Ende
sonst beginnen
CanMoveY := False;
Form1.DockToForm := True;
Ende;
Ende;
//Dieser Abschnitt speichert die Wiedergabeliste in der Mitte von Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) und (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) und
(Form2.Top > Form1.Top+Form1.Height-10) und (Form2.Top < Form1.Top+Form1.Height+10) dann
beginnen
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
wenn (X-OldX > 10) oder (X-OldX < -10) oder (Y-OldY > 10) oder (Y-OldY < -10), dann
CanMoveX := wahr
anders
CanMoveX := False;
Ende;
Ende;
Ende;
procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
beginnen
CanMove := false;
Ende;
Ende.
Ich hoffe, dass das oben Genannte für diejenigen hilfreich ist, die mit ähnlichen Inhalten zu kämpfen haben.