La réponse acceptée est un truc cool, mais il ne fonctionne pas toujours si le formulaire est couvert par un contrôle enfant à quai Fill comme un groupe spécial (ou dérivés), par exemple, parce que ce contrôle va manger tous la plupart des messages Windows.
Voici une approche simple qui fonctionne dans ce cas aussi: tirer le contrôle en question (utiliser cette classe au lieu de la norme) un message de souris poignée comme ceci:
private class MyTableLayoutPanel : Panel // or TableLayoutPanel, etc.
{
private Point _mouseDown;
private Point _formLocation;
private bool _capture;
// NOTE: we cannot use the WM_NCHITTEST/HTCAPTION trick because the table is in control, not the owning form...
protected override void OnMouseDown(MouseEventArgs e)
{
_capture = true;
_mouseDown = e.Location;
_formLocation = ((Form)TopLevelControl).Location;
}
protected override void OnMouseUp(MouseEventArgs e)
{
_capture = false;
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (_capture)
{
int dx = e.Location.X - _mouseDown.X;
int dy = e.Location.Y - _mouseDown.Y;
Point newLocation = new Point(_formLocation.X + dx, _formLocation.Y + dy);
((Form)TopLevelControl).Location = newLocation;
_formLocation = newLocation;
}
}
}
Cela rend le menu contextuel disponible. –
Cela fonctionne, mais si l'écran de démarrage a des contrôles (disons une étiquette), cliquer sur l'étiquette ne le déplace pas. Comment gérer cela spécialement si le splash a plusieurs contrôles? – supafly