public partial class Form3 : Form
    {
        private bool mouseStatus = false;//鼠标状态,false为松开
        private List<Rectangle> rectList = new List<Rectangle>();//存储所有画过的矩形
        private Point startPoint;//鼠标按下的点
        private Point endPoint;//
        private Rectangle currRect;//当前正在绘制的举行
        private int minStartX, minStartY, maxEndX, maxEndY;//最大重绘矩形的上下左右的坐标,这样重绘的效率更高。
        public Form3()
        {
            InitializeComponent();
        }        public string chang = "";
        public string kuang = "";
        public string mianji = "";
        public string mianjidaibiao = "";
                private void Form3_Load(object sender, EventArgs e)
        {
            label3.Text = chang;
            label5.Text = kuang;
            label9.Text = mianji;
            label7.Text = mianjidaibiao;
        }        private void button1_Click(object sender, EventArgs e)
        {
            Graphics G = this.CreateGraphics();
            Pen P1 = new Pen(Color.Black, 1);
            int changdu, kuandu,  bilidu;
            int hangshu, lieshu;
            bilidu=Convert.ToInt32(textBox1.Text);
            changdu = Convert.ToInt32(chang) / bilidu;
            kuandu = Convert.ToInt32(kuang) / bilidu;
            hangshu = Convert.ToInt32(textBox3.Text);
            lieshu = Convert.ToInt32(textBox2.Text);
            Rectangle R1 = new Rectangle(15, 130, changdu, kuandu);
            G.DrawRectangle(P1, R1);
            for (int i = 0; i < 15 + changdu; i += changdu / lieshu)
            {
                G.DrawLine(P1, 15 + i, 130, 15 + i, 130 + kuandu);
            }
            for (int j = 0; j < 130 + kuandu; j += kuandu / hangshu)
            {
                G.DrawLine(P1, 15, 130 + j, 15 + changdu, 130 + j);
            }
           
        }        private void Form3_MouseUp(object sender, MouseEventArgs e)
        {
            mouseStatus = false;
            endPoint.X = e.X; endPoint.Y = e.Y;
            int realStartX = Math.Min(startPoint.X, endPoint.X);
            int realStartY = Math.Min(startPoint.Y, endPoint.Y);
            int realEndX = Math.Max(startPoint.X, endPoint.X);
            int realEndY = Math.Max(startPoint.Y, endPoint.Y);
            currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
            rectList.Add(currRect);//当前矩形算是被认可了,所以存起来
            this.Invalidate();//重绘整个界面
        }        private void Form3_MouseMove(object sender, MouseEventArgs e)
        {
            if (mouseStatus)
            {
                endPoint.X = e.X; endPoint.Y = e.Y;
                //这一段是获取要绘制矩形的上下左右的坐标,如果不这样处理的话,只有从左上开始往右下角才能画出矩形。
                //这样处理的话,可以任意方向,当然中途可以更换方向。
                int realStartX = Math.Min(startPoint.X, endPoint.X);
                int realStartY = Math.Min(startPoint.Y, endPoint.Y);
                int realEndX = Math.Max(startPoint.X, endPoint.X);
                int realEndY = Math.Max(startPoint.Y, endPoint.Y);                minStartX = Math.Min(minStartX, realStartX);
                minStartY = Math.Min(minStartY, realStartY);
                maxEndX = Math.Max(maxEndX, realEndX);
                maxEndY = Math.Max(maxEndY, realEndY);                currRect = new Rectangle(realStartX, realStartY, realEndX - realStartX, realEndY - realStartY);
                //一下是为了获取最大重绘矩形。
                Rectangle refeshRect = new Rectangle(minStartX, minStartY, maxEndX - minStartX, maxEndY - minStartY);
                refeshRect.Inflate(1, 1);//重绘矩形的大小扩展1个单位
                this.Invalidate(refeshRect);//失效一个区域,并使其重绘。
            }
        }        private void Form3_MouseDown(object sender, MouseEventArgs e)
        {
            mouseStatus = true;
            startPoint.X = e.X;
            startPoint.Y = e.Y;
            //重新一个矩形,重置最大重绘矩形的上下左右的坐标
            minStartX = e.X;
            minStartY = e.Y;
            maxEndX = e.X;
            maxEndY = e.Y;
        }        private void Form3_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            //g.Clear(this.BackColor);
            g.DrawRectangle(new Pen(Color.Red, 1), currRect);
            foreach (Rectangle rect in rectList)
                g.DrawRectangle(new Pen(Color.Red, 1), rect);
        }

解决方案 »

  1.   

    窗体绘制没有问题。可以画出很多矩形。下面的这几个变量
    changdu:长度  kuandu:宽度  bilidu:??
    hangshu:行数  lieshu:列数在绘制了n个矩形后,你到底要实现怎样的功能?
    button1是干什么用的?
      

  2.   

    这几个变量我是想做一些图形分块用的,这仅仅是一部分,用button1画出n个矩形,然后接着就是要选择这其中的一些,进行填充,可是等我用鼠标进行选择的时候,原来画的那些矩形就没有了,所以,我就想显示原来画好的矩形,接着用鼠标进行选择,
      

  3.   

    还是不大明白你的意思。现在不用button1,在窗体上就能画了。
    分块是指要在一个矩形内部绘制网格吗?
      

  4.   

    对的,就是button1中间已经绘制成网格了,现在就是要选择这中间一些网格,问题是以用鼠标选择网格,原来通过button1画好的矩形就没有了,
      

  5.   

    button1的代码要改。你是临时绘制的,刷新就没有了。另外你的这些行数、宽度什么的整型变量要注意值的合理范围,容易造成死循环的,用户设置后最好要判断一下。         private void button1_Click(object sender, EventArgs e)
            {
                
                Pen P1 = new Pen(Color.Black, 1);
                int changdu, kuandu, bilidu;
                int hangshu, lieshu;
                bilidu = Convert.ToInt32(textBox1.Text);
                changdu = Convert.ToInt32(chang) / bilidu;
                kuandu = Convert.ToInt32(kuang) / bilidu;
                hangshu = Convert.ToInt32(textBox3.Text);
                lieshu = Convert.ToInt32(textBox2.Text);
                Rectangle R1 = new Rectangle(15, 130, changdu, kuandu);
                Bitmap bitmap = new Bitmap(this.Width, this.Height);
                Graphics G = Graphics.FromImage(bitmap);
                G.DrawRectangle(P1, R1);            for (int i = 0; i < 15 + changdu; i += changdu / lieshu)
                {
                    G.DrawLine(P1, 15 + i, 130, 15 + i, 130 + kuandu);
                }
                for (int j = 0; j < 130 + kuandu; j += kuandu / hangshu)
                {
                    G.DrawLine(P1, 15, 130 + j, 15 + changdu, 130 + j);
                }
                this.BackgroundImageLayout = ImageLayout.None;
                this.BackgroundImage = bitmap;        }
      

  6.   

    多谢这位大哥,小弟是刚刚学C#,很多不懂,能不能留下这位大哥的联系方式,小弟qq,562965110,谢谢