Wenn Sie möchten, dass ein Teil des Formulars sich wie die Überschrift verhält, ist der WM_NCHITTEST
Trick, den SLaks gab, der richtige Weg. Aber wenn Sie ein untergeordnetes Fenster erstellen möchten, können Sie das Formular ziehen und es gibt einen anderen Weg.
Wenn Sie eine WM_SYSCOMMAND-Nachricht an DefWindowProc mit der Befehls-ID MOUSE_MOVE senden, wird Windows in den Drag-Modus gehen. Im Grunde genommen, wie die Überschrift es tut, aber indem wir den mittleren Mann ausschneiden, können wir diesen Ziehvorgang aus einem untergeordneten Fenster einleiten, und wir erhalten nicht alle anderen Untertitelverhalten.
public class form1 : Form
{
...
[DllImport("user32.dll")]
static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, UIntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool ReleaseCapture(IntPtr hwnd);
const uint WM_SYSCOMMAND = 0x112;
const uint MOUSE_MOVE = 0xF012;
public void DragMe()
{
DefWindowProc(this.Handle, WM_SYSCOMMAND, (UIntPtr)MOUSE_MOVE, IntPtr.Zero);
}
private void button1_MouseDown(object sender, MouseEventArgs e)
{
Control ctl = sender as Control;
// when we get a buttondown message from a button control
// the button has capture, we need to release capture so
// or DragMe() won't work.
ReleaseCapture(ctl.Handle);
this.DragMe(); // put the form into mousedrag mode.
}
Danke für den Code! –