如果發現有什麼錯誤地方,請指正,本文章僅僅是個人的瞭解和學習結果。
本文章介紹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:
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics graphicsOfE = e.Graphics;
graphicsOfE.DrawString("有事件數據對象進行繪製而成", new Font("楷體",10, FontStyle.Bold), new SolidBrush(Color.Green), new Point(200, 100));
_graphicsOfPanel.DrawPie(new Pen(Color.Red) { Width = 4 }, new Rectangle(0, 200, 200, 200), 30, 30);
}
private void Form1_Load(object sender, EventArgs e)
{
_graphicsOfPanel = Graphics.FromHwnd(this.panel1.Handle);
_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)