MDI子捕获鼠标输入以移动父MDI容器

时间:2012-10-21 18:07:54

标签: c# winforms mdi

我有一个适合1280x800的MDI父容器(表单样式:无)。子表单适合于内部,例如,在子边缘和父级之间可能有1或2个像素填充。意思是看起来无缝。

我知道如何使单独的表单可拖动(无论您在表单上单击并按住的位置),但是是否可以让孩子指示MDI父级在屏幕上移动?原因是用户可以单击父级上没有任何内容。我们不能将对象添加到父对象(如菜单),因为它会与我们的设计冲突。

关于这一个的建议?目标是用户可以点击并拖动孩子的任何地方,它将移动整个应用程序。

1 个答案:

答案 0 :(得分:1)

试试这个:

public partial class Form1 : Form { 
  private const int WM_NCLBUTTONDOWN = 0xA1;
  private const int HT_CAPTION = 0x2;

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

  public Form1() {
    InitializeComponent();
    Form f = new Form();
    f.MouseDown += ChildForm_MouseDown;
    f.MdiParent = this;
    f.Show();
  }

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

MDI Parent表单正在监听子mousedown事件,当用户单击子表单时,它就像用户点击主表单的标题栏一样。