仔細研究表單和控制項是如何重繪自己的還記得早些時候我們說使用Graphics對象 就是自己控製圖形繪製吧。這就好像告訴.NET“嘿,我知道自己做什麼呢。我可以承擔額外的責任。”在繪製和重繪的時候,有可能你不想在表單最小化和最大化的時候重繪...或者你想要更頻繁的重繪。一旦你瞭解了表單和控制項的幕後情景,你就可以自己掌握重繪了:①每個表單都有Paint事件表單需要重繪自己的時候,就會觸發Paint事件。那麼是誰負責觸發事件呢?是一個叫做OnPaint的方法,該方法是表單或者使用者控制項從Cont
問:在PhotoShop中縮放圖片不是更好嗎?答:如果你掌控著這些圖片資源的話就可以。而實際上,這些圖片有可能是唯讀或者線上資源。問:但是在.NET之外把它縮小總是更好的吧?答:如果你確信你不會再次需要把它放大就可以,實際上把它放大比縮小麻煩多了。問:我知道CreateGraphics()方法用來擷取在表單上繪製的Graphics對象,那麼FromImage()方法是做什麼的?答:它用來擷取在一個Bitmap上繪製用的Graphics對象。問:那麼說來,Graphics並不是只用來在表單上繪製圖
Attribute在C# WinForm控制項開發中的使用是如何的呢?我們在之前的文章中提到了Attribute,那麼具體的在開發實戰中是如何運用的呢?需要注意什麼呢?來讓我們看看一個Attribute在C# WinForm控制項開發中的使用的執行個體。 Attribute在C# WinForm控制項開發中的使用的執行個體
即使是不縮放,把映像繪製到表單上也需要時間。假設你已經把所有的圖片都縮放過了。要把那些蜜蜂,花朵和蜂巢繪製出來還是需要時間。我們現在是使用Graphics把映像繪製到表單上去。如果你的眼睛捕捉到一次渲染的尾部,你會認為它是一次閃動。由於需要繪製的圖形很多,所以很有可能會出現閃爍。這就是多數業餘電腦遊戲的毛病...人眼捕捉到渲染的尾部,把它當做一次閃爍。
學習的好處要到建立些什麼東西的時候才看得出來。在寫出可以工作的代碼之前,很難知道你是否真的掌握了C#的核心概念。這一章,我們要學一些零碎的東西:timer和用LINQ來處理集合(只列舉某些)。我們還要建立一個很複雜的應用的第一階段,並且確保你很好的掌握了前面幾章學過的知識。做好準備...我們要建立一些很酷的程式了。
BeeControl和PictureBox很類似...所以我們就從繼承PictureBox開始吧工具箱中的控制項都是對象,所以要建立一個新的控制項也很簡單。你只需要建立一個新類讓它繼承一個已有的控制項並添加需要的行為即可。我們需要一個叫做BeeControl的控制項,它顯示一隻扇動翅膀的蜜蜂。不過我們首先從顯示一個不會動的圖片開始。如下做:①建立一個項目並把四個動畫單元添加到項目的資源中去。 ②我們已經繪製好了四幅圖,你可以在www.headfirstlabs.com/books/hfcsha
使用Graphics對象縮放Bitmap我們來仔細研究一下添加到渲染器中的ResizeImage()方法。首先,它建立一個Bitmap對象,其尺寸正是圖片需要被縮放到的尺寸。然後使用Graphics.FromImage()方法來建立一個新的Graphics對象。使用Graphics對象的DrawImage()方法來把圖片繪製到Bitmap上去。向該方法中傳遞進去代表圖片尺寸的長寬數值。最後返回Bitmap對象,它可以被用作表單的背景或者是動畫單元。 看看實際中的映像縮放下面做的只是臨時的,做完
雙緩衝可以使得動畫更加平滑回到圖片縮放器,隨便玩玩上面的TrackBar。注意到拖動滑塊的時候,有很多的閃爍了嗎?這是因為每次滑塊移動一點,Paint事件的處理器就要繪製白色矩形和圖片。當你的眼睛每秒鐘看到很多次交替的白色矩形和圖片的時候,就會感覺到閃爍。這很可惡...而這是可以通過使用一種叫做雙緩衝的技術來避免的。這就是說,把每一幀繪製到一個不可見的Bitmap上去(一個“緩衝”),只在一幀被繪製完成之後才把它顯示出來。下面是該方法使用Bitmap的方式:①這是一個典型的使用Graphics來
Graphics可以解決我們的透明度問題你可能已經想出來了,DrawImage()方法是解決重疊問題的關鍵。我們來解決問題吧!①添加一個DrawBee()方法,它用來使用任何Graphics對象來繪製一隻蜜蜂。它使用DrawImage()方法的重載版本,它接受一個Rectangle來定義在何處繪製及其尺寸。②下面是表單的新的Click事件處理器。它把蜂巢的左上方繪製在表單之外,位置在(-Width,-Height)。並用DrawBee()方法繪製四隻蜜蜂。③...但是有一個問題當你把表單拖拽出螢
雙緩衝是內建於表單和控制項中的你可以使用Bitmap來做雙緩衝,但是C#和.NET通過內建的支援使得這一點更簡單。只需要把DoubleBuffered屬性設定為true。回到Zoomer使用者控制項--把它的DoubleBuffered設定為true,它就會停止閃爍了。現在回到BeeControl也這樣處理。這樣不可以解決所有的圖形問題--但是會有所改善。徹底檢修蜂巢模擬器如下做:①從移除BeeControl使用者控制項開始在蜂巢和闐園中不再會有任何的控制項。沒有BeeControl,沒有Pi
使用Paint事件來讓你的圖形可以持續存在如果繪製到表單上的圖形會在表單被遮擋的時候消失的話,那可不好。很幸運,有一個簡單的方式來讓圖形持久存在:編寫一個Paint事件處理器。表單在每次需要重繪的時候都會觸發Paint事件--比如被拖動出螢幕範圍的時候。它的PaintEventArgs參數有一個Graphics屬性,用它繪製的東西可以“持久”。①添加一個Paint事件處理方法Paint事件在每一次你的映像被弄花的時候都會被觸發。所以在Paint事件處理方法內部編寫繪製的代碼可以使得繪製的圖形持久
看起來不錯,但是有的東西不太對仔細觀察一下飛舞在蜂巢和花朵之間的蜜蜂,你將會發現蜜蜂們被渲染的方式有些問題。還記得你把BeeControl的BackColor屬性設定為Color.Transparent了嗎?不幸的是,這並不足以使得程式避免問題,這些問題在圖形程式中是很常見的。①有一些很嚴重的效能問題注意到所有的蜜蜂都在蜂巢之內的時候模擬器會變慢嗎?如果沒有的話,改變一下World類中的常數。注意幀率--添加更多的蜜蜂,幀率將會顯著地下降。②花朵的背景並非真的透明花朵的圖片的背景是透明的,以此
該是時候解決掉蜂巢模擬器中的小故障了。使用雙緩衝來把模擬器弄得漂亮一點。①改變主表單的RunFrame()方法你需要移除對於Renderer.Recder()的調用並添加兩個Invalidate()調用。 ②給主表單再添加一個Timer來使得蜜蜂的翅膀扇動拖拽一個Timer到主表單上去,設定其Interval為150,設定其Enabled為true。然後雙擊它並添加如下的事件處理方法: 然後把這個AnimateBees()方法添加到渲染器中去來使得蜜蜂的翅膀扇動:
使用Bitmap對象和DrawImage()方法,以及表單和使用者控制項的知識來建立一個使用TrackBar來縮放圖片的使用者控制項。①向一個新使用者控制項上添加兩個TrackBar控制項建立一個新的表單應用。添加一個使用者控制項--命名為Zoomer--設定其Size為(300,300)。拖拽兩個TrackBar到上面去。trackBar1拖到底部。trackBar2拖到右側,並設定其Orientation為Horizontal。兩個TrackBar的Minimum都設定為1,Maximum設
③為雙緩衝的動畫設定好蜂巢和闐園表單移除表單構造方法中設定背景映像的代碼。移除所有表單上的控制項並把表單的DoubleBuffered屬性設定為true。給兩個表單添加Paint事件處理方法。下面是蜂巢表單的Paint事件的處理方法--田園表單的差不多,只是它調用PaintField()方法而已: ④兩個表單都需要一個公有的renderer屬性:移除所有的對於渲染器的Reset()方法的調用,把所有的new Renderer()語句替換為對下面的CreateRenderer()方法的調用: ⑤
建立你自己的第一個動畫控制項你要建立一個動畫的控制項,它顯示一隻會動的蜜蜂。這並沒有聽上去那麼難:一張接一張的繪製圖片就可以產生動畫的效果了。我們很幸運,C#和.NET處理資源的方式使得這件事兒很簡單。 我們想要一個可以放入工具箱的控制項如果你正確的建立了BeeControl,它將會出現在工具箱裡,和你可以拖拽的那些控制項一樣。它看起來就會類似一個顯示著蜜蜂的PictureBox,只是翅膀在揮動。
建立一個按鈕來向表單添加BeeControl向一個表單添加一個控制項很簡單--把它加入Controls集合即可。移除也是一樣簡單。不過控制項都實現了IDisposable介面,所以要確定移除控制項之後要去銷毀對象。如下做:①從你的表單上移除BeeControl,並添加一個按鈕。我們將使用這個按鈕來添加和移除BeeControl。②添加一個按鈕來添加和移除BeeControl下面是它的事件處理方法: 現在運行程式,點擊按鈕一次將會添加一個新的BeeControl到表單上去。再次點擊將會刪除它。
BeeControl也需要釋放本身包含的控制項Control類實現了IDisposable介面,所以你需要確保每個使用過的控制項都得以釋放掉。BeeControl內部含有一個Timer控制項,而它沒有得以釋放掉,這是個問題。不過很幸運,這個問題很容易修複--覆寫Dispose()方法即可。③覆寫Dispose()方法來釋放TimerBeeControl繼承自Control,所以它必然含有Dispose()方法。所以我們可以覆寫該方法來釋放Timer。進入代碼鍵入override: 在智能感應視
仔細研究一下那些效能問題你下載的那些蜜蜂的圖片都很大。這就意味著PictureBox在顯示它們的時候需要縮放,而縮放圖片需要耗費很多時間。很多蜜蜂在蜂巢中飛舞的時候程式會變慢的原因是因為蜂巢的圖片很巨大。當你把BeeControl的背景設定為透明的時候,有兩件事兒要做:首先需要縮小圖片,然後需縮小表單背景的一部分,這樣就可以把它繪製到蜜蜂背後的透明地區。 所以我們需要做的就是在顯示之前首先把圖片縮小。
需要改進圖形效能的方法就是給渲染器添加一個方法來縮放圖片。然後我們就可以在每張圖片載入之後縮放它,而且只在BeeControl中和蜂巢表單中使用縮放過之後的版本。如下做:①給渲染器添加一個ResizeImage方法所有儲存在項目中的圖片都是以Bitmap對象的形式存在的。下面是一個縮放圖片的靜態方法--把它添加到Renderer類中: ②給BeeControl添加這個ResizeCells方法你的BeeControl可以儲存自己的Bitmap對象--在一個數組中。下面可以產生這個數組,把每一個