Gibt es eine Möglichkeit, ein Formular ohne Rahmen (FormBorderStyle ist auf "Keine" gesetzt) beweglich zu machen, wenn Sie mit der Maus auf das Formular klicken, als ob es einen Rand gäbe?
108
Dieser Artikel über CodeProject beschreibt eine Technik. Im Grunde läuft es darauf hinaus:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Dies gilt im Wesentlichen genau die gleiche wie die Titelleiste eines Fensters greifen, aus der Sicht des Window - Manager.
Form1_MouseDown
nicht dem tatsächlichenMouseDown
Ereignis von zugewiesen istForm1
.this.MouseDown += ...
dieMain()
Funktion für das Formular hinzufügenMachen wir die Dinge nicht schwieriger als nötig. Ich bin auf so viele Codeausschnitte gestoßen, mit denen Sie ein Formular (oder ein anderes Steuerelement) verschieben können. Und viele von ihnen haben ihre eigenen Nachteile / Nebenwirkungen. Insbesondere diejenigen, bei denen Windows zu der Annahme verleitet wird, dass ein Steuerelement in einem Formular das eigentliche Formular ist.
Davon abgesehen ist hier mein Ausschnitt. Ich benutze es die ganze Zeit. Ich möchte auch darauf hinweisen, dass Sie dies nicht verwenden sollten.Invalidate (); wie andere es gerne tun, weil es in einigen Fällen dazu führt, dass die Form flackert. Und in einigen Fällen auch. Aktualisieren. Mit this.Update hatte ich keine flackernden Probleme:
quelle
Ein weiterer einfacher Weg, um das Gleiche zu tun.
quelle
Verwenden Sie MouseDown, MouseMove und MouseUp. Sie können dafür ein Variablenflag setzen. Ich habe ein Beispiel, aber ich denke, Sie müssen es überarbeiten.
Ich codiere die Mausaktion in ein Panel. Sobald Sie auf das Bedienfeld klicken, wird Ihr Formular mit verschoben.
quelle
Nur WPF
Ich habe nicht den genauen Code zur Hand, aber in einem kürzlich durchgeführten Projekt habe ich das MouseDown-Ereignis verwendet und einfach Folgendes ausgedrückt:
Window.DragMove-Methode (MSDN)
quelle
Ref. Video-Link
Dies ist getestet und leicht zu verstehen.
quelle
WM_NCHITTEST
in Verkleidung.Es gibt keine Eigenschaft, die Sie umdrehen können, um dies einfach magisch geschehen zu lassen. Schauen Sie sich die Ereignisse für das Formular an und es wird ziemlich trivial, dies durch Setzen von
this.Top
und zu implementierenthis.Left
. Insbesondere möchten Sie sich ansehenMouseDown
,MouseUp
undMouseMove
.quelle
Dies kann Ihr Problem lösen ....
quelle
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Dieses Stück Code vom obigen Link hat in meinem Fall den Trick gemacht :)
quelle
Der beste Weg, den ich gefunden habe (natürlich modifiziert)
Um Drag auf ein Steuerelement anzuwenden, fügen Sie dies einfach nach InitializeComponent () ein.
quelle
Es hat bei mir funktioniert.
quelle
Für .NET Framework 4
Sie können
this.DragMove()
für dasMouseDown
Ereignis der Komponente (in diesem Beispiel mainLayout) verwenden, die Sie zum Ziehen verwenden.quelle
Der einfachste Weg ist:
Erstellen Sie zunächst ein Label mit dem Namen label1. Gehen Sie zu den Ereignissen von label1> Mausereignisse> Label1_Mouse Verschieben und schreiben Sie diese:
quelle
Ich habe versucht, ein randloses Fensterformular beweglich zu machen, das ein WPF-Element-Host-Steuerelement und ein WPF-Benutzersteuerelement enthielt.
Am Ende hatte ich ein Stack-Panel namens StackPanel in meinem WPF-Benutzersteuerelement, das logisch zu versuchen schien, auf zu klicken, um es zu verschieben. Der Versuch, den Code von junmats zu verwenden, funktionierte, wenn ich die Maus langsam bewegte. Wenn ich die Maus jedoch schneller bewegte, bewegte sich die Maus vom Formular weg und das Formular blieb irgendwo in der Mitte der Bewegung hängen.
Dies verbesserte seine Antwort auf meine Situation mit CaptureMouse und ReleaseCaptureMouse, und jetzt bewegt sich die Maus nicht mehr vom Formular weg, während sie es bewegt, selbst wenn ich es schnell bewege.
quelle
Da bei einigen Antworten untergeordnete Steuerelemente nicht ziehbar sind, habe ich eine kleine Hilfsklasse erstellt. Es sollte das oberste Formular übergeben werden. Kann auf Wunsch allgemeiner gestaltet werden.
quelle
Wenn Sie doppelklicken und Ihr Formular vergrößern / verkleinern müssen, können Sie die erste Antwort verwenden, eine globale int-Variable erstellen und jedes Mal 1 hinzufügen, wenn der Benutzer auf die Komponente klickt, die Sie zum Ziehen verwenden. Wenn
variable == 2
ja, machen Sie Ihr Formular größer / kleiner. Verwenden Sie auch einen Timer für jede halbe Sekunde oder Sekunde, um Ihrevariable = 0
;quelle
Das Hinzufügen eines
MouseLeftButtonDown
Ereignishandlers zum MainWindow hat für mich funktioniert.Fügen Sie in der Ereignisfunktion, die automatisch generiert wird, den folgenden Code hinzu:
quelle
Ich erweitere die Lösung von jay_t55 um eine weitere Methode
ToolStrip1_MouseLeave
, die das Ereignis behandelt, dass sich die Maus schnell bewegt und die Region verlässt.quelle
Ich habe folgendes versucht und Presto Changeo, mein transparentes Fenster war nicht mehr eingefroren, sondern konnte verschoben werden !! (werfen Sie all diese anderen komplexen Lösungen oben weg ...)
quelle
Form 1():
new Moveable(control1, control2, control3);
Klasse:
quelle
quelle