日期:2014-05-20  浏览次数:20944 次

再winform中,怎么让控件移动时移不出父容器。
再winform中,怎么让控件移动时移不出父容器。
如果不用任何容器的控件,那就不能移动出当前的form窗体。
最好给下例子,我现在脑子很乱。
我的代码
C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace tc
{
    public partial class Form4 : Form
    {
        //将被拖动的控件 
        private Control control; 
        public Form4()
        {
            InitializeComponent();
            //this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form4_Paint);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);

            control = new Button();
            control.MouseDown += new MouseEventHandler(button1_MouseDown);
            control.MouseMove += new MouseEventHandler(button1_MouseMove);
            control.MouseUp += new MouseEventHandler(button1_MouseUp);
            this.Controls.Add(control);   
        }


        //鼠标按下坐标(control控件的相对坐标) 
        Point mouseDownPoint = Point.Empty;
        //显示拖动效果的矩形 
        Rectangle rect = Rectangle.Empty;
        //是否正在拖拽 
        bool isDrag = false;


        //重置变量 
        private void reset()
        {
            mouseDownPoint = Point.Empty;
            rect = Rectangle.Empty;
            isDrag = false;
        } 





        //窗体重绘 
        private void Form4_Paint(object sender, PaintEventArgs e)
        {
            if (rect != Rectangle.Empty)
            {
                if (isDrag)
                {//画一个和Control一样大小的黑框 
                    e.Graphics.DrawRectangle(Pens.Black, rect);
                }
                else
                {
                    e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
                }
            }
        }
        //把相对与control控件的坐标,转换成相对于窗体的坐标。 
        private Point getPointToForm(Point p)
        {
            return this.PointToClient(control.PointToScreen(p));
        }

         void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint = e.Location;
                //记录控件的大小 
                rect = control.Bounds;
            } 

        }

         void button1_MouseMove(object sender, MouseEventArgs e)
        {

            if (e.Button == MouseButtons.Left)
            {
                    isDrag = true;
                    //重新设置rect的位置,跟随鼠标移动 
                    rect.Location = getPointToForm(new Point(e.Location.X - mouseDownPoint.X, e.Location.Y - mouseDownPoint.Y));
                    this.Refresh();
                    
               // }
            } 

        }

         void button1_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (isDrag)
                {
                    isDrag = false;
                    //移动control到放开鼠标的地方 
                    control.Location = rect.Location;
                    this.Refresh();
                }
                reset();

            } 

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (rect != Rectangle.Empty)
            {
                if (isDrag)
                {//画一个和Control一样大小的黑框 
                    e.Graphics.DrawRectangle(Pens.Black, rect);
                }
                else
                {
                    e.Graphics.DrawRectangle(new Pen(this.BackColor), rect);
                }
            }
        } 


    }
}





------解决方案--------------------
你的意思是不用mdi窗体是吗?

------解决方案--------------------
LZ。你的意思不是很明确