c# winform 動態畫矩形 矩形大小可以拖動


http://jhlong12345.blog.163.com/blog/static/1230631292015544450189/# 
結合上一篇,繼續
矩形大小的調整
 
還有小bug,思路有了,就行了,就不貼修改正常的代碼了,自己動動手,有思路基本都可以很快寫出來的
 
思路:

畫一個矩形,然后在mousedown時,判斷鼠標是否在區域內,如果在,就在四個角畫四個小正方形,然后在mousemove中判斷是否在四個方格中,如果在,就出現箭頭鼠標,然后做個標記,表示開始調整尺寸

 
 
 
直接看代碼吧,有點復雜了
 

         

 //是否開始畫了

        bool bDrawStart = false;

        //矩形的起始點

        Point pointStart = Point.Empty;

        //矩形的起始點的對角點,鼠標移動點

        Point pointContinue = Point.Empty;

        //是否要修改矩形,以鼠標點擊點在矩形內部為准,修改時自動在4個端點創建4個小方框,不能創建其他的矩形

        bool bChange = false;

 

        //修改矩形時移動點的X、Y記錄,好根據它在dicPoints找到對應的矩形,或dicPointsChange找到對應小方框

        Point pMove1 = Point.Empty;

        Point pMove2 = Point.Empty;

        //修改矩形時鼠標點擊進4個小方框內,確認要根據鼠標移動修改

        bool bChangeMove = false;

        //當前全部創建的矩形的記錄

        Dictionary<Point, Point> dicPoints = new Dictionary<Point, Point>();

        //矩形要修改大小時4個端點創建4個小方框的記錄

        Dictionary<Point, Point> dicPointsChange = new Dictionary<Point, Point>();

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

        {

            if (bDrawStart)

            {

                bDrawStart = false;

            }

            else

            {

                bDrawStart = true;

                pointStart = e.Location;

            }

 

            if (bChange)

            {

                bDrawStart = false;

                foreach (var item in dicPointsChange)

                {

                    Point p1 = item.Key;

                    Point p2 = item.Value;

 

                    //如果在4個小框里

                    if ((e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) ||

                        (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y) ||

                        (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) ||

                        (e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y))

                    {

                        bChangeMove = true;

                       

                        //p1、p2為小方框的對角點,中心點為矩形的端點,首先獲取端點,

                        //然后根據pMove1,pMove2確定小方框在的端點是矩形的哪個端點

                        //最后確定起始點,起始點pointStart為移動點(鼠標點擊點、小方框在的端點)的對角點

                        //pointContinue為移動點(鼠標點擊點、小方框在的端點)

                        Point p = Point.Empty;

                        p.X = p1.X > p2.X ? p1.X - 5 : p1.X + 5;

                        p.Y = p1.Y > p2.Y ? p1.Y - 5 : p1.Y + 5;

 

                        if (p == pMove1)

                        {

                            pointStart = pMove2;

                        }

                        else

                            if (p == pMove2)

                            {

                                pointStart = pMove1;

                            }

                            else

                                if (p == new Point(pMove1.X, pMove2.Y))

                                {

                                    pointStart = new Point(pMove2.X, pMove1.Y);

                                }

                                else

                                    if (p == new Point(pMove2.X, pMove1.Y))

                                    {

                                        pointStart = new Point(pMove1.X, pMove2.Y);

                                    }

                        

                        break;

                    }

                }

 

                //如果沒點擊4個小方框,則默認放棄修改

                if (!bChangeMove)

                {

                    bDrawStart = true;

                    dicPointsChange.Clear();

                    bChange = false;

                }

            }

            else

            {

                foreach (var item in dicPoints)

                {

                    Point p1 = item.Key;

                    Point p2 = item.Value;

                    

                    if ((e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) ||

                        (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y) ||

                        (e.Location.X > p2.X && e.Location.X < p1.X && e.Location.Y > p1.Y && e.Location.Y < p2.Y) ||

                        (e.Location.X > p1.X && e.Location.X < p2.X && e.Location.Y > p2.Y && e.Location.Y < p1.Y))

                    {

                        bChange = true;

                        bDrawStart = false; //不能畫新矩形了

                        dicPointsChange.Clear();

 

                        pMove1 = p1;

                        pMove2 = p2;

 

                        //畫出點擊矩形的4個端點的4個小方框,並記錄入dicPointsChange

                        Graphics g = pictureBox1.CreateGraphics();

                        System.Drawing.Pen pen = new System.Drawing.Pen(Color.Red);

                        g.DrawRectangle(pen, p1.X - 5, p1.Y - 5, 10, 10);

                        g.DrawRectangle(pen, p2.X - 5, p2.Y - 5, 10, 10);

                        g.DrawRectangle(pen, p1.X - 5, p2.Y - 5, 10, 10);

                        g.DrawRectangle(pen, p2.X - 5, p1.Y - 5, 10, 10);

                        pen.Dispose();

 

                        dicPointsChange.Add(new Point(p1.X - 5, p1.Y - 5), new Point(p1.X + 5, p1.Y + 5));

                        dicPointsChange.Add(new Point(p2.X - 5, p2.Y - 5), new Point(p2.X + 5, p2.Y + 5));

                        dicPointsChange.Add(new Point(p2.X - 5, p1.Y - 5), new Point(p2.X + 5, p1.Y + 5));

                        dicPointsChange.Add(new Point(p1.X - 5, p2.Y - 5), new Point(p1.X + 5, p2.Y + 5));

                        break;

                    }

                }

            }

        }

 

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

        {

            if (bDrawStart)

            {

                pointContinue = e.Location;

                Refresh();

            }

 

            if (bChangeMove)

            {

                pointContinue = e.Location;

                Point p = Point.Empty;

                foreach (var item in dicPoints)

                {

                    Point p1 = item.Key;

                    Point p2 = item.Value;

                    //找到dicPoints里的原始記錄

                    if (p1 == pointStart || p2 == pointStart || new Point(p1.X, p2.Y) == pointStart || new Point(p2.X, p1.Y) == pointStart)

                    {

                        p = p1;

                        break;

                    }

                }

 

                if (p != Point.Empty)

                {

                    //先刪除dicPoints里的原始記錄,再根據新點創建新的記錄

                    dicPoints.Remove(p);

                    dicPoints.Add(pointStart, pointContinue);

 

                    dicPointsChange.Clear();

 

                    Point p1 = pointStart;

                    Point p2 = pointContinue;

                    //移動過程即時創建4個小方框,看起來小方框和矩形一起變大變小的效果

                    dicPointsChange.Add(new Point(p1.X - 5, p1.Y - 5), new Point(p1.X + 5, p1.Y + 5));

                    dicPointsChange.Add(new Point(p2.X - 5, p2.Y - 5), new Point(p2.X + 5, p2.Y + 5));

                    dicPointsChange.Add(new Point(p2.X - 5, p1.Y - 5), new Point(p2.X + 5, p1.Y + 5));

                    dicPointsChange.Add(new Point(p1.X - 5, p2.Y - 5), new Point(p1.X + 5, p2.Y + 5));

                    Refresh();

                }

            }

        }

 

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

        {

            if (bDrawStart)

            {   //此時矩形畫完,記錄矩形兩個對角點,在Paint里畫

                dicPoints.Add(pointStart, pointContinue);

            }

 

            if (bChangeMove)

            {

                bChangeMove = false;

                bChange = false;

            }

 

            bDrawStart = false;

        }

 

        private void pictureBox1_Paint(object sender, PaintEventArgs e)

        {

            System.Drawing.Pen pen = new System.Drawing.Pen(Color.LimeGreen);

            pen.Width = 2;

            if (bDrawStart)

            {

                //實時的畫矩形

                Graphics g = e.Graphics;

                g.DrawRectangle(pen, pointStart.X, pointStart.Y, pointContinue.X - pointStart.X, pointContinue.Y - pointStart.Y);

            }

 

            //實時的畫之前已經畫好的矩形

            foreach (var item in dicPoints)

            {

                Point p1 = item.Key;

                Point p2 = item.Value;

 

                e.Graphics.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);

            }

 

            if (bChangeMove)

            {

                pen.Color = Color.Red;

                foreach (var item in dicPointsChange)

                {

                    Point p1 = item.Key;

                    Point p2 = item.Value;

                   

                    e.Graphics.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);

                }

            }

 

            pen.Dispose();

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM