none
Перемещение формы RRS feed

  • Вопрос

  • private void button1_MouseDown(object sender, MouseEventArgs e)
            {
                _click = true;  
            }
            
            private void button1_MouseMove(object sender, MouseEventArgs e)
            {
                if (_click)
                {
                    if (ActiveForm != null) ActiveForm.Location = new Point(e.X + Location.X, e.Y + Location.Y);
                }
            }
    
            private void button1_MouseUp(object sender, MouseEventArgs e)
            {
                _click = false;
                if (ActiveForm != null) ActiveForm.Location = new Point(e.X + Location.X, e.Y + Location.Y);
            }

    что то не правильно перемещает форму

Ответы

  • Вот так правильно:

    		private Boolean _click;
    		private Point p;
    
    		private void button1_MouseDown(object sender, MouseEventArgs e)
    		{
    			_click = true;
    			p = new Point(e.X, e.Y);
    		}
    
    		private void button1_MouseMove(object sender, MouseEventArgs e)
    		{
    			if (_click)
    			{
    				if (ActiveForm != null)
    					ActiveForm.Location = new Point(Location.X + (e.X - p.X), Location.Y + (e.Y - p.Y));
    			}
    		}
    
    		private void button1_MouseUp(object sender, MouseEventArgs e)
    		{
    			_click = false;
    			if (ActiveForm != null)
    				ActiveForm.Location = new Point(Location.X + (e.X - p.X), Location.Y + (e.Y - p.Y));
    		}

    • Предложено в качестве ответа Bazzzy 9 мая 2013 г. 11:20
    • Помечено в качестве ответа Medet Tleukabiluly 9 мая 2013 г. 12:18

Все ответы

  • Что именно неправильно работает?
  • Вот так правильно:

    		private Boolean _click;
    		private Point p;
    
    		private void button1_MouseDown(object sender, MouseEventArgs e)
    		{
    			_click = true;
    			p = new Point(e.X, e.Y);
    		}
    
    		private void button1_MouseMove(object sender, MouseEventArgs e)
    		{
    			if (_click)
    			{
    				if (ActiveForm != null)
    					ActiveForm.Location = new Point(Location.X + (e.X - p.X), Location.Y + (e.Y - p.Y));
    			}
    		}
    
    		private void button1_MouseUp(object sender, MouseEventArgs e)
    		{
    			_click = false;
    			if (ActiveForm != null)
    				ActiveForm.Location = new Point(Location.X + (e.X - p.X), Location.Y + (e.Y - p.Y));
    		}

    • Предложено в качестве ответа Bazzzy 9 мая 2013 г. 11:20
    • Помечено в качестве ответа Medet Tleukabiluly 9 мая 2013 г. 12:18
  • При начале перемещения формы происходит "скачек", а все по тому, что не учитывается высота заголовка окна и ширина рамки окна:

    Вот так будет лучше:

    		public Point mouse_offset;
    		private Int32 HeaderHeight = 0;
    		private Int32 BorderWidth = 0;
    
    		private void Form1_MouseDown(object sender, MouseEventArgs e)
    		{
    			mouse_offset = new Point(-e.X, -e.Y);
    			BorderWidth = (this.Width - this.ClientSize.Width) / 2;
    			HeaderHeight = this.Height - BorderWidth - this.ClientSize.Height;
    		}
    
    		private void Form1_MouseMove(object sender, MouseEventArgs e)
    		{
    			if (e.Button == MouseButtons.Left)
    			{
    				Point mousePos = Control.MousePosition;
    				mousePos.Offset(mouse_offset.X - BorderWidth, mouse_offset.Y - HeaderHeight); 
    				Location = mousePos; 
    			}
    		}

    Теперь форма будет перемещаться сразу плавно.

    Да, и почему у Вас переменная "mouse_offset" обязательно публичная?