一 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()方法主動觸發窗體或控件的重繪。
三 示例代碼下載