一篇文章讓你徹底弄懂WinForm GDI 編程基本原理

 

一 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()方法主動觸發窗體或控件的重繪。 

 

三 示例代碼下載

代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章