用SetStyle方法重繪你的表單

來源:互聯網
上載者:User
鮮為人知的SetStyle方法可以讓你控制重繪一個表單的方式。
by Ken Getz
註:Ken Getz在Orlando的VSLive!上同Brian Randell一起舉辦了一個主題為“Build a Rich Client App with Visual Studio .NET”的研討會。本篇技巧選自該研討會的資料。
運用GDI+和Windows表單,我們可以很容易地建立一個漸層色(gradient)來填充一個地區。運用.NET Framework提供的簡單的方法,你可以建立linear gradients(線型漸層填充)或path gradients(路徑漸層填充)。然而,真正的問題是這些複雜的背景圖形是資源密集型(resource-intensive)的。最近,我正在做一個類比的時鐘示範程式,用一個漸層色來填充鐘面。每一秒,當時鐘重繪它的鐘面來顯示時鐘指標的正確位置時,它也重繪了整個背景漸層色。即使在一台很快的機器上,這種方法也並不很好。我將向你介紹SetStyle方法,它可以讓你指定如何、何時來重繪你的表單。
首先,用下面的代碼做實驗,你可以從中得到一些著色變換的樂趣。修改一個新表單的Paint事件使它包含該代碼:
Private Sub frmMain_Paint( _ ByVal sender As Object, _ ByVal e As PaintEventArgs) _ Handles MyBase.Paint  Dim path As New GraphicsPath()  Dim pt As New PointF()  Dim rct As Rectangle = Me.ClientRectangle  path.AddRectangle(rct)  Dim pgb As New PathGradientBrush(path)  pt = New PointF( _   CType(Me.ClientSize.Width / 2, Single), _   CType(Me.ClientSize.Height / 2, Single))  pgb.CenterPoint = pt  Dim Colors() As Color = _   {Color.Red, Color.Orange, Color.Yellow, _   Color.Green, _   Color.Blue, Color.Indigo, Color.Violet}  Dim Positions() As Single = _   {0.0, 0.1, 0.2, 0.4, 0.6, 0.8, 1}  Dim cb As ColorBlend = New ColorBlend()  cb.Colors = Colors  cb.Positions = Positions  pgb.InterpolationColors = cb  e.Graphics.FillRectangle(pgb, rct)  Dim f As New StringFormat()  f.Alignment = StringAlignment.Center  e.Graphics.DrawString( _   Date.Now.ToLongTimeString, _   New Font("Tahoma", 13), Brushes.White, pt, f)End Sub

這裡有很多代碼,但它們很簡單。該代碼建立了一個新的GraphicsPath對象,給GraphicsPath添加一個填充了整個表單的矩形,然後根據GraphicsPath建立一個GradientBrush對象。該代碼為漸層色設定了中心點,建立了要用的漸層顏色數組,建立位置數組(色彩坡形的整個範圍),建立一個新的預設的ColorBlend對象,設定漸層色的屬性,然後用漸層色填充矩形。
另外,給表單添加一個Timer控制項,啟用它,將時間間隔設定為500毫秒,將下面的代碼添加到Timer事件中:
Private Sub Timer1_Tick( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Timer1.Tick  Me.Invalidate()End Sub

運行該程式,你就可以得到一個有顏色背景的漂亮的時鐘了。有問題嗎?是的,通常會有漸層色重繪的問題。而且畫面閃動得很厲害,你不得不警惕它對視力的損傷。另外,當你嘗試調整表單大小時,你會發現,在你強迫表單重繪前(將另一個表單拖到該表單上,然後移開先前的表單。我不建議將這種方法推薦給終端使用者),漸層色不會自己進行調整。
解決方案很簡單:表單的SetStyle方法可以讓你設定不同的值,這些值影響表單重繪的方式。你可以把ResizeDraw樣式(style)設定為True,這樣當你調整表單的大小時,表單就自動地重繪了。你也可以把DoubleBuffer樣式設定成True,這樣當每次重繪表單的某一部分時,就不會完全重繪整個表單了。該選項佔用額外的記憶體,這是因為在.NET運行時,除了實際的表單本身佔用記憶體外,表單圖片的一個副本也必須儲存在記憶體中,但這麼做的結果是很值得的。(要運用DoubleBuffer選項,你也必須將AllPaintingInWmPaint和UserPaint樣式設定成True。)在你的表單的Load事件中添加下面的代碼,你就可以完成該設定了:
Me.SetStyle(ControlStyles.ResizeRedraw, True)Me.SetStyle(ControlStyles.AllPaintingInWmPaint _    Or ControlStyles.UserPaint Or _    ControlStyles.DoubleBuffer, True)

重新運行該示範程式,你會看到你就得到了一個大小調整了的、迷人的、填充了漸層色的數字時鐘。關於這個有用的方法的更多的資料,請查看.NET Framework協助檔案中的SetStyle方法。

關於作者:
Ken Getz是MCW Technologies公司的一位進階顧問,他的時間主要用來編程、寫書和培訓。Ken已經編寫了許多技術書籍了,包括與Paul D. Sheriff合作的ASP.NET Developer’s JumpStart。他的連絡方式是keng@mcwtech.com。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。