C# winform開發:Graphics、pictureBox同時畫多個矩形


C#的System.Drawing 命名空間提供了對 GDI+ 基本圖形功能的訪問

 

重點在於獲取Graphics對象,例如:

 Graphics g = panel1.CreateGraphics

 

事實上CreateGraphics繼承自Control, 即基本每一種控件都有這個方法

Control.CreateGraphics

 

在pannel、form上畫圖都一樣,這里以pictureBox為例。DrawRectangle函數為例畫矩形,其他形狀不在這里考慮,自己嘗試很簡單

 

畫圓是畫橢圓,只需g.DrawEllipse后兩個int參數width,height要設置相等,同時前兩個int參數並不是圓心而是左上角的坐標,沒有自帶的circle函數只能自己封裝

 

回到正題:

網上給的都是MouseDown  MouseMove MouseUp  Paint事件相關的代碼,非常的簡單。

 

using System.Drawing;

 

    bool bDrawStart = false;

        Point pointStart = Point.Empty;

        Point pointContinue = Point.Empty;

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)

        {

            if (bDrawStart)

            {

                bDrawStart = false;

            }

            else

            {

                bDrawStart = true;

                pointStart = e.Location;

            }

        }

 

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)

        {

            if (bDrawStart)

            {

                pointContinue = e.Location;

                Refresh();

            }

        }

 

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)

        {

            if (bDrawStart)

            {

                dicPoints.Add(pointStart, pointContinue);

            }

 

            bDrawStart = false;

        }

 

        private void pictureBox1_Paint(object sender, PaintEventArgs e)

        {

            if (bDrawStart)

            {

                //實時的畫矩形

                Graphics g = e.Graphics;

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

            }

            pen.Dispose();

        }

 

 

用完就發現很明顯的問題了,一次只能畫一個圖形

如何才能一次畫多個呢?不少都說的重寫Paint事件,override之類的函數,多麻煩。

試驗修改Paint事件代碼即可,定義一個字典表記錄畫過的矩形(根據對角兩個點確定一個矩形,對應字典表的key, value,不考慮矩形相交重疊之類的情況),如下:

 

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

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);

            }

            pen.Dispose();

 

        }

 


免責聲明!

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



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