Graphics類及相關類詳解

如果發現有什麼錯誤地方,請指正,本文章僅僅是個人的瞭解和學習結果。
本文章介紹Graphics類的使用並通過demo進行了解,至於User32.Dll的使用在其他文章進行詳細介紹。

1.相關介紹。
2.屬性。
3.函數。
4.創建Graphics。
5.注意事項
6.Demo。

個人理解:Graphics是一個畫家,而創建Graphics的參數Handle或者Image等爲畫板,當Graphics進行繪製時需要的Brush,Pen等則爲工具,Graphics的函數則爲行爲。

1.介紹Graphics類和相關知識。
    1.1Graphics
        Graphics類包含在System.Drawing名稱空間下,是密封類(Sealed)無法被繼承,封裝一個 GDI+ 繪圖圖面。
        Graphics對象表示GDI+繪圖表面,是用於創建圖形圖像的對象。
    1.2GDI和GDI+:
        GDI圖形設備接口(Graphics Device Interface)。
        GDI+是微軟在操作系統中提供的新的圖形設備接口,其通過一套部署爲託管代碼(由CLR執行的代碼)的類來展示,這套類被稱爲GDI+的託管類接口。
    1.3System.Drawing命名空間
        GDI+相關的類全部在此命名空間下。
        Graphics 類提供了繪製到顯示設備的方法。諸如 Rectangle 和 Point 等類可封裝 GDI+ 基元。Pen 類用於繪製直線和曲線,而從抽象類 Brush 派生出的類則用於填充形狀的內部。
        不支持在 Windows 或 ASP.NET 服務中使用 System.Drawing 命名空間中的類。

2.Graphics屬性介紹:
    2.1Clip
        獲取或設置Region,該對象限定此Graphics的繪圖區域(此屬性在不保證範圍的情況下,請勿進行修改,否則會導致繪圖結果只顯示部分,因爲繪圖相關座標不在此區域內)
    2.2ClipBounds
        獲取一個 RectangleF 結構,該結構限定Graphics 的剪輯區域。
    2.3CompositingMode
        獲取一個值,該值指定如何將合成圖像繪製到此Graphics。
    2.4CompositingQuality
        獲取或設置繪製到此Graphics 的合成圖像的呈現質量。
    2.5InterpolationMode
        獲取或設置與此 System.Drawing.Graphics 關聯的插補模式
    2.6IsClipEmpty
        獲取一個值,該值指示此Graphics 的剪輯區域是否爲空。
    2.7IsVisibleClipEmpty
        獲取一個值,該值指示此Graphics 的可見剪輯區域是否爲空。
    2.8PageScale
         獲取或設置此Graphics 的世界單位和頁單位之間的比例。
    2.9PageUnit
         獲取或設置用於此Graphics 中的頁座標的度量單位。
    2.10PixelOffsetMode
        獲取或設置一個值,該值指定在呈現此Graphics 的過程中像素如何偏移。
    2.11RenderingOrigin
        爲抵色處理和陰影畫筆獲取或設置此Graphics 的呈現原點
    2.12RenderingOrigin
        爲抵色處理和陰影畫筆獲取或設置此Graphics 的呈現原點。
    2.13TextRenderingHint
        獲取或設置與此Graphics 關聯的文本的呈現模式。
    2.14Transform
        獲取或設置此Graphics 的幾何世界變換的副本。
    2.15VisibleClipBounds
        獲取此Graphics 的可見剪輯區域的邊框。

3.函數
    3.1AddMetafileComment(byte[] data)
    向當前 System.Drawing.Imaging.Metafile 添加註釋。
3.2BeginContainer()
    重載overload
    保存具有此 System.Drawing.Graphics 的當前狀態的圖形容器,然後打開並使用新的圖形容器。
3.3Clear(Color color)
    清除整個繪圖面並以指定背景色填充。
3.4 CopyFromScreen
    重載overload
    執行顏色數據(對應於由像素組成的矩形)從屏幕到 System.Drawing.Graphics 的繪圖圖面的位塊傳輸。
3.5 Dispose
    釋放由 System.Drawing.Graphics 使用的所有資源。

3.6 DrawArc
    overload
     繪製一段弧線,它表示 System.Drawing.Rectangle 結構指定的橢圓的一部分。
3.7 DrawBezier
    overload
    繪製貝塞爾樣條。
3.8 DrawClosedCurve
    overload
    繪製閉合基數樣條。
3.9 DrawCurve
    overload
    繪製基數樣條。
3.10 DrawEllipse
    overload
    繪製橢圓。
3.11 DrawIcon
    overload
     繪製指定的 System.Drawing.Icon 表示的圖像。
3.12DrawIconUnstretched
    繪製指定的 System.Drawing.Icon 表示的圖像,而不縮放該圖像。
3.13DrawImage
    overload
    繪製指定的 System.Drawing.Image。
3.14DrawImageUnscaled
    overload
    使用圖像的原始物理大小繪製指定的圖像。
3.15DrawLine
    overload
    繪製一條線
3.16DrawPath
    繪製相互連接的直線和曲線
3.17DrawPie
    overload
    繪製扇形
3.18DrawPolygon
    overload
    繪製多邊形
3.20 DrawRectangle
    overload
    繪製指定的矩形
3.21 DrawString
    overload
    繪製指定字符串
3.22EndContainer(GraphicsContainer container)
    關閉當前圖形容器,並將此 System.Drawing.Graphics 的狀態還原到通過調用 System.Drawing.Graphics.BeginContainer()方法保存的狀態。
3.23 EnumerateMetafile
    overload
    將指定 System.Drawing.Imaging.Metafile 中的記錄逐個發送到回調方法以在指定的位置顯示。
3.24 ExcludeClip
    overload
    更新此 System.Drawing.Graphics 的剪輯區域,以排除 System.Drawing.Rectangle 結構所指定的區域。
3.25 FillClosedCurve
    overload
     填充由 System.Drawing.Point 結構數組定義的閉合基數樣條曲線的內部。
3.26 FillEllipse
    填充 System.Drawing.Rectangle 結構指定的邊框所定義的橢圓的內部。
3.27FillPath
    填充 System.Drawing.Drawing2D.GraphicsPath 的內部。
3.28 FillPie
    填充橢圓所定義的扇形區的內部,該橢圓由 System.Drawing.RectangleF 結構和兩條射線指定。
3.29FillPolygon
    填充 System.Drawing.Point 結構指定的點數組所定義的多邊形的內部。
3.30FillRectangle
    填充 System.Drawing.Rectangle 結構指定的矩形的內部。
3.31 FillRegion
    填充 System.Drawing.Region 的內部。
3.32 Flush
    overload
    強制執行所有掛起的圖形操作並立即返回而不等待操作完成。
3.33 GetContextInfo
     獲取累積的圖形上下文。
3.34 GetHalftonePalette 
    獲取當前 Windows 的半色調調色板的句柄。
3.35GetHdc
    獲取與此 System.Drawing.Graphics 關聯的設備上下文的句柄。
3.36 GetNearestColor
    獲取與指定的 System.Drawing.Color 結構最接近的顏色。
3.37 MeasureCharacterRanges
    獲取 System.Drawing.Region 對象的數組,其中每個對象將字符位置的範圍限定在指定字符串內。
3.38 MeasureString
     測量用指定的 System.Drawing.Font 繪製的指定字符串。
3.39 Save
    保存此 System.Drawing.Graphics 的當前狀態,並用 System.Drawing.Drawing2D.GraphicsState.

4.構造函數
    Graphics的構造函數無法訪問,沒辦法new出來。
    4.1Graphics提供五中靜態方法可以創建Graphics對象。
        1) Graphics.FromImage(Image);
        2)Graphics.FromHdcInternal(IntPtr hdc);
        3)Graphics. FromHwnd(IntPtr hwnd);
        4)Graphics.FromHdc(IntPtr hdc);
        5)Graphics.FromHdc(IntPtr hdc, IntPtr hdevice);
    4.2很多派生自事件參數EventArgs(包含事件數據的類的基類)的類中都有Graphics屬性,例如PrintPageEventArgs、PaintEventArgs等。
    e.Graphics.

5.注意事項:
    1.在哪個控件上進行繪製,那麼必須通過這個控件進行實例化Graphics對象。
    2.注意控件的層次問題,防止由於層次問題導致的繪圖效果無法看到,例如在Form進行繪製,而Form中有Panel。
    3.由於窗體拖動問題,或者最小化等操作,會導致窗體和控件的重新繪製,也就是觸發Paint事件,導致繪製內容丟失,所以,我個人在進行繪畫的操作都是在控件Paint事件中重新繪製圖畫或者是在圖片上繪製內容,通過窗體中的Picture進行顯示繪製內容。

6.Demo進行舉例講解
    Code:
//panel的繪製事件
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            //我們能看到事件數據的對象e,包含屬性Graphics
            Graphics graphicsOfE = e.Graphics;
            //Brush是個抽象類,無法被實現,派生類SolidBrush等。
            graphicsOfE.DrawString("有事件數據對象進行繪製而成", new Font("楷體",10, FontStyle.Bold), new SolidBrush(Color.Green), new Point(200, 100));

            //使用Handle進行繪製對比
            _graphicsOfPanel.DrawPie(new Pen(Color.Red) { Width = 4 }, new Rectangle(0, 200, 200, 200), 30, 30);
        }

        //此處無任何效果
        private void Form1_Load(object sender, EventArgs e)
        {
            //創建Graphics對象
            _graphicsOfPanel = Graphics.FromHwnd(this.panel1.Handle);
            //繪製線,Pens類,快速獲取pen對象
            _graphicsOfPanel.DrawLine(Pens.Blue, new Point(0, 0), new Point(200, 200));

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //此處繪製沒問題,在窗體最小化,或者將窗體放置到屏幕不可見部分後,繪圖內容會丟失。
            //因爲最小化後再次顯示窗體會進行重新繪製
            _graphicsOfPanel.DrawRectangle(Pens.Blue, new Rectangle(200, 200, 200, 200));
        }
Effect Pictrue:
![這裏寫圖片描述](https://img-blog.csdn.net/20170726070824812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ194dWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

After Moving Pictrue:
    ![這裏寫圖片描述](https://img-blog.csdn.net/20170726070527613?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ194dWFu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章