Comment ferais-je pour empêcher un formulaire d'être déplacé. J'ai le style de bordure de formulaire défini en FixedSingle et j'aimerais le conserver de cette façon, car il a l'air bien dans Vista :)
Jetez un oeil à ce link . Vous pourriez être intéressé par l'option n ° 3. Vous devrez envelopper du code natif, mais cela devrait fonctionner. Il y a aussi un commentaire au bas du lien qui montre un moyen plus facile de le faire. Tiré du commentaire (je ne peux pas en prendre le crédit, mais je vous épargne quelques recherches):
protected override void WndProc(ref Message message)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_MOVE = 0xF010;
switch(message.Msg)
{
case WM_SYSCOMMAND:
int command = message.WParam.ToInt32() & 0xfff0;
if (command == SC_MOVE)
return;
break;
}
base.WndProc(ref message);
}
Vous pouvez définir la propriété FormBorderStyle
du formulaire sur Aucune.
this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None
J'ai trouvé que cela empêchait le formulaire de bouger (son en c #)
protected override void WndProc(ref Message m)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_MOVE = 0xF010;
switch (m.Msg)
{
case WM_SYSCOMMAND:
int command = m.WParam.ToInt32() & 0xfff0;
if (command == SC_MOVE)
return;
break;
}
base.WndProc(ref m);
}
Ce n'est pas une bonne pratique de rendre votre formulaire inamovible. J'y penserais bien si j'étais toi.
Quoi qu'il en soit, vous pouvez le faire en remplaçant le WinProc pour désactiver le menu [Move] dans le menu système.
[DllImport("user32.dll")]
private static extern Int32 EnableMenuItem ( System.IntPtr hMenu , Int32uIDEnableItem, Int32 uEnable);
private const Int32 HTCAPTION = 0×00000002;
private const Int32 MF_BYCOMMAND =0×00000000;
private const Int32 MF_ENABLED =0×00000000;
private const Int32 MF_GRAYED =0×00000001;
private const Int32 MF_DISABLED =0×00000002;
private const Int32 SC_MOVE = 0xF010;
private const Int32 WM_NCLBUTTONDOWN = 0xA1;
private const Int32 WM_SYSCOMMAND = 0×112;
private const Int32 WM_INITMENUPOPUP = 0×117;
protected override void WndProc(ref System.Windows.Forms.Message m )
{
if (m.Msg == WM_INITMENUPOPUP)
{
//handles popup of system menu
if ((m.LParam.ToInt32() / 65536) != 0) // 'divide by 65536 to get hiword
{
Int32 AbleFlags = MF_ENABLED;
if (!Moveable)
{
AbleFlags = MF_DISABLED | MF_GRAYED; // disable the move
}
EnableMenuItem(m.WParam, SC_MOVE, MF_BYCOMMAND | AbleFlags);
}
}
if (!Moveable)
{
if (m.Msg == WM_NCLBUTTONDOWN) //cancels the drag this is IMP
{
if (m.WParam.ToInt32() == HTCAPTION) return;
}
if (m.Msg == WM_SYSCOMMAND) // Cancels any clicks on move menu
{
if ((m.WParam.ToInt32() & 0xFFF0) == SC_MOVE) return;
}
}
base.WndProc(ref m);
}
En outre, vous pouvez gérer l'événement OnMove
de votre formulaire. Mais je pense que cela va provoquer des scintillements:
private void Form1_Move(object sender, EventArgs e)
{
this.Location = defaultLocation;
}
Ce n'est pas beau (il y a des clignotements lorsque vous essayez de déplacer le formulaire), mais vous pouvez utiliser la propriété LocationChanged pour conserver le formulaire à l'endroit souhaité:
private Point _desiredLocation;
// assign the _desiredLocation variable with the form location at some
// point in the code where you know that the form is in the "correct" position
private void Form_LocationChanged(object sender, EventArgs e)
{
if (this.Location != _desiredLocation)
{
this.Location = _desiredLocation;
}
}
Par curiosité; pourquoi voudriez-vous faire cela?
Sous Windows, le style WS_CAPTION est la zone non-client qui permet de déplacer votre fenêtre avec une souris. Donc, le moyen le plus simple de faire ce que vous voulez est de supprimer ce style de votre fenêtre.
Toutefois, si vous avez besoin d'une légende tout en obtenant ce que vous voulez, le prochain style consisterait à capturer le message WM_NCHITTEST et à vérifier la présence de HTCAPTION. Si le code est HTCAPTION, retournez NTNOWHERE à la place. Cela empêchera la procédure de fenêtre par défaut d’exécuter la fonction de fenêtre de déplacement par défaut.
Essayez de remplacer WndProc:
protected override void WndProc(ref Message m)
{
const int WM_NCLBUTTONDOWN = 161;
const int WM_SYSCOMMAND = 274;
const int HTCAPTION = 2;
const int SC_MOVE = 61456;
if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE))
{
return;
}
if ((m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION))
{
return;
}
base.WndProc(ref m);
}
écrire le code suivant
Location = new Point(this.Width,this.Height);
Il suffit de changer la propriété FormBorderStyle
en None
.
Il suffit de réinitialiser l’emplacement de l’événement formlocation_changed à son état actuel, c’est-à-dire de définir le Form.Location sur une variable avant son déplacement. Lorsque l’utilisateur essaie de le déplacer, il retourne à l’emplacement de la variable sur lequel il a été défini.
Sous-maître privé MyFormLock () Me.Location = Nouveau Point (0, 0) End Sub
Private Sub SearchSDR_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
Call MyFormLock()
End Sub
Je m'interroge sur votre besoin de rendre le formulaire inamovible. Cela ne sonne pas bien. Vous pouvez bien sûr enregistrer l'emplacement de la fenêtre lorsque celle-ci se ferme et rouvrir la fenêtre dans cette position. Cela donne à l'utilisateur un certain contrôle sur l'emplacement de la fenêtre.
remplacez la propriété de formulaire StartPostion par Manuel . Ensuite, gérez l'événement LocationChanged:
private void frmMain_LocationChanged(object sender, EventArgs e)
{
Location = new Point(0, 0);
}
Tu peux essayer:
this.Locked = true;
Vous pouvez vous abonner à l'événement Form.Move
et vous en repositionner.