Make a borderless form movable?

前端 未结 21 1803
情歌与酒
情歌与酒 2020-11-22 09:48

Is there a way to make a form that has no border (FormBorderStyle is set to \"none\") movable when the mouse is clicked down on the form just as if there was a border?

21条回答
  •  情歌与酒
    2020-11-22 10:25

    Since some answers do not allow for child controls to be draggable, I've created a little helper class. It should be passed the top level form. Can be made more generic if desired.

    class MouseDragger
    {
        private readonly Form _form;
        private Point _mouseDown;
    
        protected void OnMouseDown(object sender, MouseEventArgs e)
        {
            _mouseDown = e.Location;
        }
    
        protected void OnMouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                int dx = e.Location.X - _mouseDown.X;
                int dy = e.Location.Y - _mouseDown.Y;
                _form.Location = new Point(_form.Location.X + dx, _form.Location.Y + dy);
            }
        }
        public MouseDragger(Form form)
        {
            _form = form;
    
            MakeDraggable(_form);            
        }
    
        private void MakeDraggable(Control control)
        {
            var type = control.GetType();
            if (typeof(Button).IsAssignableFrom(type))
            {
                return;
            }
    
            control.MouseDown += OnMouseDown;
            control.MouseMove += OnMouseMove;
    
            foreach (Control child in control.Controls)
            {
                MakeDraggable(child);
            }
        }
    }
    

提交回复
热议问题