一 GDI編程原理
GDI(Graphics Device Interface,圖形設備接口),主要負責Windows系統與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。
GDI的常用對象有Graphics、Pen、Font、Brush等。
在GDI的所有類中,Graphics類是核心,在繪制任何圖形之前,一定要先創建或得到一個Graphics類的對象。
那么什么是Graphics呢?
可以將Graphics對象理解成一個畫圖環境,這個畫圖環境包括:要畫在什么東西上,用什么畫(什么顏色,類型的畫筆,畫刷),怎么畫(畫圓形還是方形等等)。
二 兩種得到Graphics對象的主要方法
1.使用窗體或控件的CreateGraphics方法,無論是Form還是button,textbox等控件均可調用,用哪個對象調用的就表明要畫在哪個對象上。

button1的事件處理函數中:
Graphics g = this.CreateGraphics(); //畫一個橢圓 g.DrawEllipse(Pens.Red, 100,100, 50, 50);// g.Dispose();
注意這里
g = this.CreateGraphics();
this代表的是form窗體本身,所以表明現在要在form上進行作圖,(100,100)是相對於form窗體左上角點的偏移。所以結果看到的就是左上邊那個圓形。
button2的事件處理函數中:
Graphics g = this.button2.CreateGraphics(); //畫一個橢圓 g.DrawEllipse(Pens.Red, 50, 50, 50, 50); g.Dispose();
和上面button1唯一不同的地方在於Graphics對象的獲取辦法:
Graphics g = this.button2.CreateGraphics();
注意,這回我們是用button2對象調用的CreateGraphics()方法,表明現在要在button2上進行作圖,(100,100)是相對於button2控件左上角點的偏移。所以結果看到的就是右邊的那個圓形。
此時,注意如果將該窗體最小化再最大化或者將窗體拖動到屏幕的外面,我們發現2個小圓形,消失了。這里是因為每當發生以上行為的時候,windows會自動觸發窗體的重繪操作,窗體重繪后,我們剛剛畫的小圓形就消失了。
2.由此可以引出我們得到Graphics對象的第二種辦法---窗體或控件的OnPaint函數。
窗體或控件的Paint事件是最常用於放置繪圖代碼的地方,每當窗體被其他窗體擋住,再次顯示的時候,窗體的所有內容必須被重繪,
窗體或控件的OnPaint函數會被windows操作系統自動調用,button2_Paint(object sender, PaintEventArgs e)
在Paint函數中,有一個PaintEventArgs e參數,通過e.Graphics,我們可以得到該窗體或控件的Graphics對象,之后的畫圖操作就和第一種方式相同了。
如果我們將繪圖代碼放到了xxx_Paint函數中,就不會發生當窗體被其他窗體擋住,再次顯示的時候,之前畫的圖形都消失了的情形了,因為這些圖形被再次重繪了。
另外,需要額外說明的是,除了用戶操作(比如最小化再最大化窗體)可以觸發xxx_Paint函數之外,程序中可以通過調用窗體或控件的Refresh()方法主動觸發窗體或控件的重繪。
三 示例代碼下載
作者:
宋波
出處: http://www.cnblogs.com/ice-river/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得准,我分文不收;相不准,你也好回來找我!
出處: http://www.cnblogs.com/ice-river/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得准,我分文不收;相不准,你也好回來找我!