走近vb.net(十一) 隨心所欲窗體外觀(skin精彩源碼)
前幾天因?yàn)閼?yīng)付約稿,答應(yīng)的這個(gè)源碼推遲了幾天,今天熬夜把他寫出來,請(qǐng)見諒。另外我想說一些題外話,前時(shí)我曾在文章中說過,說vb.net的面向?qū)ο蟪ujava,delphi沒有實(shí)際根據(jù)(你總不能把面象對(duì)象理解成linux核心一樣的源碼技術(shù),他主要還是一種指導(dǎo)思想),這句話本身就有了邏輯性的錯(cuò)誤,請(qǐng)問java與delphi是誰抄誰呢?答案只能是smalltalk的面向?qū)ο蟾纾ㄒ娡鯂?guó)榮的文章)。 vc的面向?qū)ο蟠蠹议]口不提,然而我個(gè)人認(rèn)為在windows編程上(不包括網(wǎng)絡(luò)應(yīng)用)vc仍是最強(qiáng)大的語言,而vc的程序員幾乎沒有人出來說這些無聊的話。那么是誰在說呢......
這個(gè)說法最早源于國(guó)外的文章(指在網(wǎng)絡(luò)應(yīng)用上有涉嫌模仿java,如果是編寫windows程序則毫無根據(jù)),而作者在后來的撰文中很清楚的告訴大家糾正此說法。我也一再提到過。可有 人視若無睹。大家現(xiàn)在就說vb.net如何如何太早了一點(diǎn),我們都是在實(shí)踐摸索,用都不會(huì)用,就毫無根據(jù)的揣測(cè)有些不智。很多學(xué)java的告訴你先學(xué)java再學(xué)vb.net.這有些不可思議,起碼到目前,沒有看到j(luò)ava程序員寫出我們可以拿來學(xué)的vb.net程序。因?yàn)橛辛嗣嫦髮?duì)象的思想不等于有了一切。
現(xiàn)在面向?qū)ο笳嬗行┥窕耍@不可思議,程序員不是哲人,是要通宵達(dá)旦的工作學(xué)習(xí)創(chuàng)造,好象一點(diǎn)也不浪漫!而現(xiàn)在竟被一部分人浪漫了。
不論微軟如何的稱頌他的網(wǎng)絡(luò)功能,我相信在不久的將來,vb.net必將成為最快速,最重要,也最適用windows平臺(tái)的應(yīng)用程序編程語言(我沒有涉及網(wǎng)絡(luò)應(yīng)用)。當(dāng)然決不可能是最強(qiáng)大的,這世界好象沒有誰最強(qiáng)大!而且我對(duì)他的網(wǎng)絡(luò)應(yīng)用不感興趣。每個(gè)人都有自已的路。正如大家都說vb如何的適宜于開發(fā)數(shù)據(jù)庫(kù)。但是你相不相信一個(gè)人從不接觸數(shù)據(jù)庫(kù)可以寫出讓人很看好的程 序,每個(gè)人有權(quán)利選擇自已的路! 如果你對(duì)網(wǎng)絡(luò)應(yīng)用毫無興趣,java還會(huì)是一個(gè)好的選擇嗎?
我個(gè)人認(rèn)為無論是java,delphi,還是vb.net甚至c++,各有各的長(zhǎng)處。各有各的用途。無優(yōu)劣之分,編程最重要的是靈感,是廣博的視野,是寬大的襟懷。任何想貶低別人的人,正暴露自已的淺見與無知。我雖然是學(xué)vb的,但我在進(jìn)入delphi的論壇以后,我亦為之感動(dòng),這里也有很多兢兢業(yè)業(yè),無私奉獻(xiàn)的值得尊敬與學(xué)習(xí)的人。工具永遠(yuǎn)不能征服人性!外國(guó)人沒有因這紙是中國(guó)人造的而不用,亦沒有因火藥是中國(guó)人發(fā)明的而羞愧,也沒有因這二進(jìn)制的起源于中國(guó)而牢騷,科學(xué)是跨越國(guó)界的,不應(yīng)被蒙上政治色彩。
我曾在一個(gè)專門介紹比爾蓋茨的網(wǎng)站看了一下他的生平,想來看過的人不少。看了他一生的奮斗歷程,我們還能說什么呢?
以上是個(gè)人的淺見(鑒于本人對(duì)delphi,java的無知,對(duì)vb.net的初識(shí)以及對(duì)面象對(duì)象技術(shù)的部分誤解),只是談?wù)劯惺埽?qǐng)勿借題發(fā)揮,大作文章。我寫這些是防止一些錯(cuò)得離譜的歪論誤導(dǎo)初學(xué)者。另外我一再鼓勵(lì)大家研究一下,弄出一些實(shí)際的心得來。我因?yàn)樽陨淼南拗婆c沒有相互的研討,所以每一篇文章寫出來所付出的努力不亞于寫一個(gè)工程。所以請(qǐng)轉(zhuǎn)載文章的在跟我聯(lián)系以后 在文中明確按本文結(jié)尾處樣式注明我的網(wǎng)站名,網(wǎng)址 。這里先向您致謝了!
另外鑒于一些初學(xué)者的要求,以及前輩的指點(diǎn),我在源碼中對(duì)入門級(jí)的知識(shí)進(jìn)行了注解,如果您認(rèn)為這些對(duì)您是多余的,請(qǐng)諒解還有很多人看不懂。
' 本源碼出自vb.net中文站 http://vbnetcn.126.com hejianzhong 請(qǐng)尊重作者勞動(dòng)不要修改此信息(ai.....................)
' ___________________________________________________________________________________________________________________
' -------------------------------------------------------------------------------------------------------------------
' 請(qǐng)首先清添加lable(lbexit,lbpre,lbshow)控件
' 請(qǐng)?jiān)趯傩詸谠O(shè)置這三個(gè)lable控件的backcolr(背景色)為system.desktop 即在出現(xiàn)的取色對(duì)話框中選擇system標(biāo)簽下的desktop顏色
' 下一步,添加axagent控件這個(gè)請(qǐng)參考拙作《走近vb.net(九) axagent動(dòng)畫窗體的實(shí)現(xiàn)》
' 設(shè)置窗體背景圖片為sk1.gif 請(qǐng)?jiān)?backgroundimage 屬性欄設(shè)置
' 所有需要的圖片用photoshop做出來,如果你不會(huì)做可到《vb.net中文論壇》去找我?guī)湍阕觥?br>
' 設(shè)置lbexit的text屬性(指在標(biāo)簽上顯示的文本)為“退出”
' 設(shè)置lbpre的text屬性(指在標(biāo)簽上顯示的文本)為“窗體”
' 設(shè)置lbshow的text屬性(指在標(biāo)簽上顯示的文本)為“動(dòng)畫”
' 設(shè)置所有l(wèi)abel的 textalign(文本的排列方式)為center(居中)
option strict off '關(guān)閉option strict
imports system.componentmodel '引用族名
imports system.drawing '引用族名
imports system.winforms '引用族名
public class form1
inherits system.winforms.form '繼承一個(gè)窗體的類
dim genie as agentobjects.iagentctlcharacterex '聲明一個(gè)agent的對(duì)象
const datapath as string = "merlin.acs" '加載動(dòng)畫數(shù)據(jù)
public frmpre as form1 '聲明一個(gè)新的窗體,請(qǐng)不要在這里使用初始化的方法或使用new方法
public imindex as short '聲明一個(gè)整數(shù)
public overloads sub new() '每一個(gè)類一般都有一個(gè)new過程,在新建一個(gè)對(duì)象(使用new方法)時(shí)調(diào)用
mybase.new() '直接調(diào)用父類的new過程
form1 = me '設(shè)定me關(guān)鍵字
initializecomponent() '下面是初始化組件,你也可以在下面使用call方法呼叫一個(gè)子過程(見前面的文章)
axagent1.characters.load("merlin", datapath) '裝載動(dòng)畫數(shù)據(jù)
genie = axagent1.characters("merlin") '把a(bǔ)gent對(duì)象賦于聲明的對(duì)象,簡(jiǎn)化書寫的過程
genie.languageid = &h409s '設(shè)定語音id
call skinregion(form1) '為窗體改變skin(外觀)
end sub
overloads sub new(byval strimage as string)
mybase.new() '直接調(diào)用父類的new過程
form1 = me '設(shè)定me關(guān)鍵字
initializecomponent() '下面是初始化組件,你也可以在下面使用call方法呼叫一個(gè)子過程(見前面的文章)
lbexit.visible = false : lbshow.visible = false : lbpre.visible = false : label3.visible = false '新窗體不顯示控制
me.top = me.top + 150 '新窗體的位置,top是距離屏幕頂部的高度
call skinregion(form1, strimage) '為窗體改變skin(外觀)
end sub
'上面使用overloads定義了兩個(gè)不同的new過程,在new過程中使用重載可以間接地使一個(gè)類產(chǎn)生很好的可重用性,如果你不明白為什么不寫一個(gè)新的過程,而一定要使用重載
'那么你看看這里的用法,一定會(huì)有所啟發(fā)的。
public overrides sub dispose() '釋放資源,終止程序
mybase.dispose() '調(diào)用父類的方法
region1.dispose() '釋放gdi資源
genie = nothing '釋放動(dòng)畫占用的資源
components.dispose() '釋放組件占用的資源
end sub
'下面的是非編輯模塊,就不用看了
#region " windows form designer generated code "
'required by the windows form designer
private components as system.componentmodel.container
private withevents lbshow as system.winforms.label
private withevents label3 as system.winforms.label
private withevents linklabel3 as system.winforms.linklabel
private withevents lbexit as system.winforms.label
private withevents lbpre as system.winforms.label
private withevents axagent1 as axagentobjects.axagent
dim withevents form1 as system.winforms.form
'note: the following procedure is required by the windows form designer
'it can be modified using the windows form designer.
'do not modify it using the code editor.
private sub initializecomponent()
dim resources as system.resources.resourcemanager = new system.resources.resourcemanager(gettype(form1))
me.components = new system.componentmodel.container()
me.lbpre = new system.winforms.label()
me.lbshow = new system.winforms.label()
me.label3 = new system.winforms.label()
me.axagent1 = new axagentobjects.axagent()
me.linklabel3 = new system.winforms.linklabel()
me.lbexit = new system.winforms.label()
axagent1.begininit()
'@design me.trayheight = 90
'@design me.traylargeicon = false
'@design me.trayautoarrange = true
lbpre.location = new system.drawing.point(32, 72)
lbpre.text = "窗體"
lbpre.size = new system.drawing.size(64, 24)
lbpre.tabindex = 10
lbpre.backcolor = system.drawing.systemcolors.desktop
lbpre.textalign = system.winforms.horizontalalignment.center
lbshow.location = new system.drawing.point(32, 24)
lbshow.text = "動(dòng)畫"
lbshow.size = new system.drawing.size(64, 24)
lbshow.tabindex = 17
lbshow.backcolor = system.drawing.systemcolors.desktop
lbshow.textalign = system.winforms.horizontalalignment.center
label3.location = new system.drawing.point(176, 16)
label3.text = " "
label3.size = new system.drawing.size(176, 88)
label3.borderstyle = system.winforms.borderstyle.fixed3d
label3.tabindex = 16
axagent1.size = new system.drawing.size(56, 40)
axagent1.ocxstate = ctype(resources.getobject("axagent1.ocxstate"), system.winforms.axhost.state)
axagent1.tabindex = 1
axagent1.location = new system.drawing.point(232, 216)
linklabel3.text = "linklabel3"
linklabel3.size = new system.drawing.size(0, 16)
linklabel3.tabindex = 15
linklabel3.tabstop = true
linklabel3.location = new system.drawing.point(352, 88)
lbexit.location = new system.drawing.point(32, 48)
lbexit.text = "退出"
lbexit.size = new system.drawing.size(64, 24)
lbexit.tabindex = 11
lbexit.backcolor = system.drawing.systemcolors.desktop
lbexit.textalign = system.winforms.horizontalalignment.center
me.text = "form1"
me.autoscalebasesize = new system.drawing.size(6, 14)
me.borderstyle = system.winforms.formborderstyle.none
me.backgroundimage = ctype(resources.getobject("$this.backgroundimage"), system.drawing.image)
me.clientsize = new system.drawing.size(392, 288)
me.controls.add(lbshow)
me.controls.add(label3)
me.controls.add(linklabel3)
me.controls.add(lbexit)
me.controls.add(lbpre)
me.controls.add(axagent1)
axagent1.endinit()
end sub
#end region
'上面的是非編輯模塊,就不用看了
protected sub lbexit_click(byval sender as object, byval e as system.eventargs)
if frmpre <> nothing then '如果加載了新窗體
frmpre.dispose() '終止新窗體
frmpre = nothing '釋放占用的資源
end if
me.dispose() '終止程序
end '徹底終止程序(如果程序無法退出,請(qǐng)使用此關(guān)鍵字)
end sub
'下面是動(dòng)畫過程,在前面的文章中很詳細(xì),可以不用看了!
protected sub lbshow_click(byval sender as object, byval e as system.eventargs)
genie.left = 500 '設(shè)定agent的位置
genie.show() '使用show方法顯示agent
genie.moveto(12, 180) 'moveto方法是移動(dòng)agent到一個(gè)位置,如果加上定時(shí)器,你可以很容易地讓他在屏幕上 亂跑()
messagebox.show("如果你是mm,請(qǐng)按ctrl+alt+del關(guān)閉 " & chr(10) & chr(13) & "您真的要繼續(xù)嗎, 等到我不 動(dòng)再說!")
genie.speak("ni hao") '發(fā)出聲音
messagebox.show("你好") '對(duì)話框,更多的參數(shù)請(qǐng)看以前的相關(guān)文章
genie.speak("wo shi hao kan di") '發(fā)出聲音
messagebox.show("我是好看的") '對(duì)話框,更多的參數(shù)請(qǐng)看以前的相關(guān)文章
genie.speak("ni shi nan kan di") '發(fā)出聲音
messagebox.show("你是難看的") '對(duì)話框,更多的參數(shù)請(qǐng)看以前的相關(guān)文章
genie.speak("zia jie mimi ") '發(fā)出聲音
messagebox.show("再見 mm") '對(duì)話框,更多的參數(shù)請(qǐng)看以前的相關(guān)文章
genie.play("wave") '揮手致意
'眾mm請(qǐng)勿生氣
'上面是開一個(gè)小玩笑,如果要真正的讀中文,就用下面的
'genie.speak("cnstring ",cnstring.wav) '這里的cnstring就是中文的語音文件
genie.hide() '使用hide方法隱藏agent
end sub
protected sub lbpre_click(byval sender as object, byval e as system.eventargs)
if frmpre <> nothing then frmpre.dispose() '如果新窗體已經(jīng)存在,清除之
dim strim as string '定義一個(gè)字符類型變量
if imindex <> 6 then '反過來想,就是說如果到了6就從頭開始,因這我只有這么幾張圖片了
imindex = imindex + 1
else
imindex = 1 '從頭開始
end if
strim = "sk" & imindex.tostring 'tostring的意思是從字符類型轉(zhuǎn)為數(shù)字類型
'在vb.net中l(wèi)abel控件有image控件一樣的作用,不但可以顯示文本而且可以顯示圖片,而在vb6中是只能顯示圖片的
label3.image = label3.image.fromfile(system.winforms.application.startuppath & "/" & strim & ".gif") 'formfile是從一個(gè)路徑裝載圖片
'system.winforms.application.startuppath的意思是當(dāng)前目錄,同vb6中的app.path
'請(qǐng)注意調(diào)試過程中使用的當(dāng)前目錄是在bin目錄下,在下一個(gè)版本有可能更改
frmpre = new form1(strim) '初始化一個(gè)實(shí)例(對(duì)象)
frmpre.visible = true '顯示新窗體,如果沒有這個(gè)只怕你什么也看不到!
end sub
'下面是移動(dòng)窗體的代碼,請(qǐng)參考前面的文章
private sub form1_mousedown(byval eventsender as system.object, byval eventargs as system.winforms.mouseeventargs)
me.capture = false '釋放鼠標(biāo)捕獲
me.sendmessage(&ha1s, 2, 0) '這是vb6中最有名的api消息函數(shù)
end sub
'下面是鼠標(biāo)移動(dòng)_mousemove時(shí)發(fā)生的事件了
public sub lbpre_mousemove(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbpre.mousemove
lbpre.backcolor = system.drawing.color.black '設(shè)置顏色
lbpre.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbexit_mousemove(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbexit.mousemove
lbexit.backcolor = system.drawing.color.black '設(shè)置顏色
lbexit.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbshow_mousemove(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbshow.mousemove
lbshow.backcolor = system.drawing.color.black '設(shè)置顏色
lbshow.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
'下面是鼠標(biāo)按下_mousemove時(shí)發(fā)生的事件了
public sub lbpre_mousedown(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbpre.mousedown
lbpre.backcolor = system.drawing.color.blue '設(shè)置顏色
lbpre.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbexit_mousedown(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbexit.mousedown
lbexit.backcolor = system.drawing.color.blue '設(shè)置顏色
lbexit.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbshow_mousedown(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbshow.mousedown
lbshow.backcolor = system.drawing.color.blue '設(shè)置顏色
lbshow.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbpre_mouseup(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbpre.mouseup
lbpre.backcolor = system.drawing.color.black '設(shè)置顏色
lbpre.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbexit_mouseup(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbexit.mouseup
lbexit.backcolor = system.drawing.color.black '設(shè)置顏色
lbexit.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
public sub lbshow_mouseup(byval sender as object, byval e as system.winforms.mouseeventargs) handles lbshow.mouseup
lbshow.backcolor = system.drawing.color.black '設(shè)置顏色
lbshow.forecolor = system.drawing.color.aliceblue '設(shè)置顏色
end sub
'下面是鼠標(biāo)離開_mouseleave時(shí)發(fā)生的事件了
public sub lbshow_mouseleave(byval sender as object, byval e as system.eventargs) handles lbshow.mouseleave
lbshow.backcolor = system.drawing.color.blanchedalmond '設(shè)置顏色
lbshow.forecolor = system.drawing.color.black '設(shè)置顏色
end sub
public sub lbexit_mouseleave(byval sender as object, byval e as system.eventargs) handles lbexit.mouseleave
lbexit.backcolor = system.drawing.color.blanchedalmond '設(shè)置顏色
lbexit.forecolor = system.drawing.color.black '設(shè)置顏色
end sub
public sub lbpre_mouseleave(byval sender as object, byval e as system.eventargs) handles lbpre.mouseleave
lbpre.backcolor = system.drawing.color.blanchedalmond '設(shè)置顏色
lbpre.forecolor = system.drawing.color.black '設(shè)置顏色
end sub
end class
'###################################################################################################################
'!!!0001!!!04!!!26!!!!!!
'建議不要修改此模塊 以免產(chǎn)生不必要的錯(cuò)誤(此代碼已相當(dāng)完美) 如欲修改請(qǐng)先備份 _______vb.net中文站 hejianzhong
'此模塊可真接粘貼到您的程序中使用。
'不要?jiǎng)h除此信息,我免費(fèi)為您提供此代碼,想得到的回報(bào)就是最起碼的尊重,雖然最終用戶并不能看到,我仍感到欣慰
'!!!0001!!!04!!!26!!!!!!
public module skin
public rect1 as new rectangle(0, 0, 0, 0)
public region1 as new system.drawing.region(rect1)
public sub skinregion(byval skform as form, optional byval skinnaskform as string = nothing)
dim x, y, transpix, opacipix, bgwidth, bgheight as integer
dim rect2 as new rectangle()
dim firargb as integer = getpixel(skform, 1, 1)
dim region1 as new system.drawing.region(rect1)
rect1 = nothing
'skform.visible = false
if skinnaskform <> nothing then skform.backgroundimage = skform.backgroundimage.fromfile(system.winforms.application.startuppath & "/" & skinnaskform & ".gif")
bgwidth = skform.backgroundimage.width
bgheight = skform.backgroundimage.height
skform.height = bgheight
skform.width = bgwidth
for y = 1 to bgheight - 1 '這里參考了vb6中的掃描方法,請(qǐng)參考相關(guān)資料
x = 0
do
x = x + 1
while (getpixel(skform, x, y) = firargb) and (x < bgwidth)
x = x + 1
end while
transpix = x
while (getpixel(skform, x, y) <> firargb) and (x < bgwidth)
x = x + 1
end while
opacipix = x - 1
if transpix <= opacipix then
rect2 = rect2.fromltrb(transpix - 1, y - 1, opacipix, y)
region1.union(rect2)
rect2 = nothing
end if
loop until x >= bgwidth
next y
skform.region = region1
skform.refresh()
'skform.visible = true
end sub
public function getpixel(byval skform as form, byval x as integer, byval y as integer) as integer
dim pm as bitmap = skform.backgroundimage
try
return pm.getpixel(x, y).toargb
catch
exit function
end try
end function
end module