2013-05-11 3 views
1

У меня есть форма, которую можно перемещать, когда пользователь нажимает и перетаскивает область границы. Реализации, которые я видел, все блокируют текущую позицию мыши, так что, когда форма перемещается, форма переходит, так что мышь находится в верхнем левом углу. Я бы хотел изменить его так, чтобы он вел себя как обычная форма окна, и форма остается в том же положении относительно мыши при перемещении. Мой текущий код выглядит так:Переместить форму относительно местоположения, нажатого

Point locationClicked; 
bool isMouseDown = false; 

private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    isMouseDown = true; 
    locationClicked = new Point(e.Location.X, e.Location.Y); 
} 

private void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    isMouseDown = false; 
} 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (isMouseDown && targetCell == new Point(-1, -1) && (mouseLocation.X < margin.X || mouseLocation.Y < margin.Y || 
     mouseLocation.X > margin.X + cellSize.Width * gridSize.Width || 
     mouseLocation.Y > margin.Y + cellSize.Height * gridSize.Height)) 
    { 
     this.Location = new Point(e.Location.X - locationClicked.X, e.Location.Y - locationClicked.Y); 
    } 
} 

Когда я перетаскиваю окно, он ведет себя аналогично тому, что я хочу. Форма мерцает между двумя местами на экране, одна из которых перемещается примерно на половину скорости мыши. Есть ли способ исправить это?

+0

Просто обрабатывать 'WM_NCHITTEST' сообщение надлежащим образом, и Windows, будет делать все окна движущегося для вас. –

ответ

2

Попробуйте это ...

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    Point locationClicked; 
    bool dragForm = false; 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      locationClicked = new Point(e.Location.X, e.Location.Y); 
      if (isMouseDown && targetCell == new Point(-1, -1) && (mouseLocation.X < margin.X || mouseLocation.Y < margin.Y || 
       mouseLocation.X > margin.X + cellSize.Width * gridSize.Width || 
       mouseLocation.Y > margin.Y + cellSize.Height * gridSize.Height)) 
      { 
       dragForm = true; 
      } 
     } 

    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (dragForm) 
     { 
      this.Location = new Point(this.Location.X + (e.X - locationClicked.X), this.Location.Y + (e.Y - locationClicked.Y)); 
     } 
    } 

    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 
     dragForm = false; 
    } 

} 
+0

Это работает, но это вызывает исключение, когда я генерирую свои границы (я действительно использовал это в свою пользу, так что это хорошо), однако он перестает работать после того, как форма перетаскивается на нижнее или правое поле. Любая идея почему? – user1576628

+0

Решил проблему, сбросив «targetCell». Благодаря! – user1576628

Смежные вопросы