2009-10-06 4 views
0

J'ai un formulaire Windows qui n'a pas de bordure, barre de titre, menu, etc. Je veux que l'utilisateur puisse maintenir la touche CTRL enfoncée, clique gauche n'importe où sur mon formulaire, et le fasse glisser, et l'ai bouge toi. Une idée de comment faire cela? J'ai essayé, mais il vacille, beaucoup:Comment déplacer un formulaire alors que la souris est maintenue enfoncée?

private void HiddenForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      this.SuspendLayout(); 
      Point xy = new Point(this.Location.X + (e.X - this.Location.X), this.Location.Y + (e.Y - this.Location.Y)); 
      this.Location = xy; 
      this.ResumeLayout(true); 
     } 
    } 

Répondre

4

Essayez cette

using System.Runtime.InteropServices; 

const int HT_CAPTION = 0x2; 
const int WM_NCLBUTTONDOWN = 0xA1; 

[DllImportAttribute("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd,int Msg, int wParam, int lParam); 
[DllImportAttribute("user32.dll")] 
public static extern bool ReleaseCapture();  


private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
    ReleaseCapture(); 
    SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
    } 
} 

Mise à jour

La fonction ReleaseCapture() libère la capture de la souris d'une fenêtre dans le thread en cours et la restauration traitement d'entrée normal de la souris. Une fenêtre qui a capturé la souris reçoit toutes les entrées de la souris, quelle que soit la position du curseur, sauf quand un bouton de la souris est cliqué alors que le point chaud du curseur est dans la fenêtre d'un autre fil.

Le message WM_NCLBUTTONDOWN est envoyé à une fenêtre lorsqu'un clic gauche de souris est effectué sur la zone non-client de la fenêtre. WParam spécifie la valeur d'énumération hit-test. Nous passons HTCAPTION et le lParam spécifie la position du curseur, que nous passons en tant que 0 de sorte qu'il est sûr d'être dans la barre de titre.

+0

Cela a bien fonctionné, juste curieux de savoir ce qu'il fait? – esac

+0

Il est mentir à la proc par défaut fenêtre qu'un événement de souris vers le bas est arrivé à la "non" client de la fenêtre de la fenêtre. Cependant, si vous voulez l'implémentation correcte, vous devez ajouter votre propre hook de proc de message et traiter le message WM_NCHITTEST pour renvoyer HT_CAPTION pour les zones de votre formulaire que vous souhaitez activer. –

+0

+1 Doux ... tu gagnes :) Je n'ai même pas eu le bon calcul LOL. –

Questions connexes