Existe-t-il un moyen de rendre un formulaire qui n'a pas de bordure (FormBorderStyle est défini sur "aucun") déplaçable lorsque la souris est cliquée sur le formulaire comme s'il y avait une bordure?
109
Cet article sur CodeProject détaille une technique. Cela se résume essentiellement à:
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);
}
}
Cela fait essentiellement exactement la même chose que saisissant la barre de titre d'une fenêtre, du point de vue du gestionnaire de fenêtres.
Form1_MouseDown
n'est pas affecté à l'MouseDown
événement réel deForm1
.this.MouseDown += ...
à laMain()
fonction pour le formulaireNe rendons pas les choses plus difficiles qu'elles ne devraient l'être. J'ai rencontré tellement d'extraits de code qui vous permettent de faire glisser un formulaire (ou un autre contrôle). Et beaucoup d'entre eux ont leurs propres inconvénients / effets secondaires. Surtout ceux où ils font croire à Windows qu'un contrôle sur un formulaire est le formulaire réel.
Cela étant dit, voici mon extrait. Je l'utilise tout le temps. Je voudrais également noter que vous ne devriez pas utiliser this.Invalidate (); comme d'autres aiment le faire car cela fait scintiller le formulaire dans certains cas. Et dans certains cas, il en va de même. En utilisant this.Update, je n'ai eu aucun problème de scintillement:
la source
Une autre façon plus simple de faire la même chose.
la source
utilisez MouseDown, MouseMove et MouseUp. Vous pouvez définir un indicateur de variable pour cela. J'ai un échantillon, mais je pense que vous devez le réviser.
Je codifie l'action de la souris sur un panneau. Une fois que vous avez cliqué sur le panneau, votre formulaire se déplacera avec lui.
la source
WPF uniquement
Je n'ai pas le code exact sous la main, mais dans un projet récent, je pense que j'ai utilisé l'événement MouseDown et j'ai simplement mis ceci:
Window.DragMove, méthode (MSDN)
la source
Réf. lien vidéo
Ceci est testé et facile à comprendre.
la source
WM_NCHITTEST
déguisé.Il n'y a aucune propriété que vous pouvez retourner pour que cela se produise comme par magie. Regardez les événements du formulaire et il devient assez simple de l'implémenter en définissant
this.Top
etthis.Left
. Plus précisément, vous voudrez regarderMouseDown
,MouseUp
etMouseMove
.la source
cela peut résoudre votre problème ...
la source
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Ce morceau de code du lien ci-dessus a fait l'affaire dans mon cas :)
la source
Meilleur moyen que j'ai trouvé (modifié bien sûr)
Pour appliquer le glissement à un contrôle, insérez simplement ceci après InitializeComponent ()
la source
Cela a fonctionné pour moi.
la source
Pour .NET Framework 4,
Vous pouvez utiliser
this.DragMove()
pour l'MouseDown
événement du composant (mainLayout dans cet exemple) que vous utilisez pour faire glisser.la source
Le moyen le plus simple est:
Créez d'abord une étiquette nommée label1. Accédez aux événements de label1> événements de souris> Label1_Mouse Move et écrivez-les:
la source
J'essayais de rendre mobile un formulaire de fenêtres sans bordure contenant un contrôle WPF Element Host et un contrôle WPF User.
Je me suis retrouvé avec un panneau de pile appelé StackPanel dans mon contrôle utilisateur WPF qui semblait la chose logique à essayer de cliquer pour se déplacer. Essayer le code de junmats fonctionnait lorsque je déplaçais lentement la souris, mais si je déplaçais la souris plus rapidement, la souris se déplaçait hors du formulaire et le formulaire serait coincé quelque part au milieu du mouvement.
Cela a amélioré sa réponse à ma situation en utilisant CaptureMouse et ReleaseCaptureMouse et maintenant la souris ne bouge pas du formulaire tout en le déplaçant même si je le déplace rapidement.
la source
Étant donné que certaines réponses ne permettent pas aux contrôles enfants d'être déplaçables, j'ai créé une petite classe d'aide. Il devrait être passé le formulaire de niveau supérieur. Peut être rendu plus générique si vous le souhaitez.
la source
De plus, si vous avez besoin de DoubleClick et d'agrandir / réduire votre formulaire, vous pouvez utiliser la première réponse, créer une variable int globale, ajouter 1 chaque fois que l'utilisateur clique sur le composant que vous utilisez pour faire glisser. Si
variable == 2
alors agrandissez / réduisez votre formulaire. Utilisez également une minuterie toutes les demi-secondes ou toutes les secondes pour créer votrevariable = 0
;la source
L'ajout d'un
MouseLeftButtonDown
gestionnaire d'événements à MainWindow a fonctionné pour moi.Dans la fonction d'événement qui est automatiquement générée, ajoutez le code ci-dessous:
la source
J'étends la solution de jay_t55 avec une autre méthode
ToolStrip1_MouseLeave
qui gère l'événement de la souris se déplaçant rapidement et quittant la région.la source
J'ai essayé ce qui suit et hop changeo, ma fenêtre transparente n'était plus figée en place mais pouvait être déplacée !! (jetez toutes ces autres solutions complexes ci-dessus ...)
la source
Formulaire 1():
new Moveable(control1, control2, control3);
Classe:
la source
la source