一篇文章讓你徹底弄懂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()方法主動觸發窗體或控件的重繪。 
 
         

三 示例代碼下載

代碼下載

  

作者: 宋波
出處: http://www.cnblogs.com/ice-river/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
正在看本人博客的這位童鞋,我看你氣度不凡,談吐間隱隱有王者之氣,日后必有一番作為!旁邊有“推薦”二字,你就順手把它點了吧,相得准,我分文不收;相不准,你也好回來找我!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM