表单没有DragMove()方法?

时间:2016-01-18 20:26:20

标签: c# .net winforms

所以无论点击什么元素我都需要移动我的表单(我需要通过按住按钮来拖动表单,表单是100%透明的),我试着这样做:

 private void MessageForm_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
            this.DragMove();
    }

但我很惊讶没有DragMove()方法,它被重命名或者我缺少什么?

如果这是不可能的,还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

你需要这样的东西:

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

[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 MessageForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{     
    if (e.Button == MouseButtons.Left)
    {
        ReleaseCapture();
        SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
    }
}

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

基本上,当您在窗口中的任何位置拖动时,它就像拖动标题栏/窗口标题一样。这对于无边框窗户来说非常棒。

修改 如果使用按钮作为移动表单的控件,则在附加单击事件处理程序时需要小心,因为要覆盖该控件的Windows窗体事件循环。

通过将ReleaseCapture和SendMessage调用移动/添加到控件的MouseDown事件,可以使用它来拖动窗口。只要您将MouseDown事件更新为与上面的代码类似,任何控件都可用于拖动窗口。

答案 1 :(得分:0)

经过测试,可以正常工作:this.DragMove(),替代方法

    private void Form1_Load(object sender, EventArgs e)
            {
                FormCommonSetting(this);
            } 
                   
   public void FromCommonSetting(Form _Form)
        {
            _Form.StartPosition = FormStartPosition.CenterScreen;
            _Form.FormBorderStyle = FormBorderStyle.None;
            _Form.MaximizeBox = false;
            _Form.ShowInTaskbar = true;
            _Form.AutoSize = false;
        }


   protected override void WndProc(ref Message _Message)
            {
                switch (_Message.Msg)
                {
                    case 0x84:
                        base.WndProc(ref _Message);
                        if ((int)_Message.Result == 0x1)
                            _Message.Result = (IntPtr)0x2;
                        return;
                }
                base.WndProc(ref _Message);
            }