国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

用SetStyle方法重繪你的窗體

2024-07-21 02:21:45
字體:
來源:轉載
供稿:網友
鮮為人知的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。他的聯系方式是[email protected]。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巧家县| 赤城县| 黄龙县| 花莲市| 盐边县| 灵石县| 宜阳县| 菏泽市| 沁源县| 中江县| 麻栗坡县| 双辽市| 张掖市| 丽水市| 忻城县| 沽源县| 绵阳市| 华阴市| 临洮县| 旺苍县| 牙克石市| 晋州市| 保靖县| 南京市| 兖州市| 浙江省| 泸溪县| 三亚市| 水富县| 安顺市| 仁怀市| 柳江县| 玉门市| 长子县| 灵璧县| 罗城| 彰武县| 昭通市| 达拉特旗| 沈丘县| 绿春县|