VBNET中幾種高級(jí)窗體技術(shù)的應(yīng)用_第1頁(yè)
VBNET中幾種高級(jí)窗體技術(shù)的應(yīng)用_第2頁(yè)
VBNET中幾種高級(jí)窗體技術(shù)的應(yīng)用_第3頁(yè)
VBNET中幾種高級(jí)窗體技術(shù)的應(yīng)用_第4頁(yè)
VBNET中幾種高級(jí)窗體技術(shù)的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

VB.NET中幾種高級(jí)窗體技術(shù)的應(yīng)用1引言:VB.NET中的窗體(Form類(lèi))相對(duì)于VB6而言,功能已變得十分強(qiáng)大,很多在VB6中需要通過(guò)API函數(shù)或復(fù)雜的編程才能完成的功能,.NET中只需要設(shè)置窗體屬性或幾行簡(jiǎn)單代碼即可實(shí)現(xiàn)。本文將從實(shí)際編程的角度出發(fā),介紹幾種VB.NET中的高級(jí)窗體技術(shù),包括子類(lèi)派生、異形窗體及透明效果、本地化窗體、動(dòng)態(tài)控件屬性等技術(shù)的應(yīng)用。2窗體子類(lèi)派生技術(shù)像限制窗體大小、判斷窗體的移動(dòng)等功能,在VB6編程中需要利用子類(lèi)派生技術(shù)來(lái)實(shí)現(xiàn),而在.NET中,很多窗體新增的屬性、事件即可完成這些任務(wù)。但有時(shí)仍然需要使用子類(lèi)派生,例如:程序中要用到一個(gè)不帶標(biāo)題欄的窗體,通過(guò)鼠標(biāo)在窗體上任何位置的拖動(dòng)來(lái)改變窗體位置。窗體對(duì)象的子類(lèi)派生技術(shù)依賴(lài)于繼承機(jī)制。System.Windows.Forms.Form類(lèi)公開(kāi)了WndProc方法,該方法被Windows發(fā)送到窗體的每條消息調(diào)用。由于WndProc方法被定義為Protected和Overridable,所以在窗體的派生類(lèi)中可以重寫(xiě)它。通過(guò)重寫(xiě)此方法,就可以重新定義窗體的行為。WinProc方法接收一個(gè)Message對(duì)象參數(shù),此對(duì)象包括5個(gè)屬性:Msg(消息的ID)、HWnd(窗口的句柄)、Wparam和Lparam(傳遞給窗口的參數(shù),取決于具體的消息)、Result(返回給操作系統(tǒng)的值)。在重寫(xiě)WinProc方法時(shí),首先應(yīng)調(diào)用其基類(lèi)的默認(rèn)處理方法,進(jìn)行一般消息的處理工作,然后檢查該消息的Msg屬性,并決定如何響應(yīng)某些特殊消息。多數(shù)情況下,我們只需根據(jù)消息給出相應(yīng)的提示,但在某些時(shí)候,需要將特定的值賦給消息的Result屬性并返還給Windows,達(dá)到“欺騙”Windows的目的。例如,下面的代碼捕獲了WM_ACTIVATEAPP消息,判斷窗體是否被激活并顯示提示;捕獲WM_NCHITTEST消息,將HTCLIENT值(代表鼠標(biāo)位于窗體的工作區(qū))改為HTCAPTION值(代表鼠標(biāo)位于窗體的標(biāo)題欄中)賦給Result屬性,以實(shí)現(xiàn)拖動(dòng),如圖1。(圖1:窗體子類(lèi)派生)PublicClassFormlInheritsSystem.Windows.Forms.Form#Region"Windows窗體設(shè)計(jì)器生成的代碼"PrivateConstWM_NCHITTESTAsInteger=&H84PrivateConstWM_ACTIVATEAPPAsInteger=&H1CPrivateConstHTCAPTIONAsInteger=2PrivateConstHTCLIENTAsInteger=1'定義消息ProtectedOverridesSubWndProc(ByRefmAsMessage)MyBase.WndProc(m)'調(diào)用基類(lèi)的WinProc方法處理消息SelectCasem.MsgCaseWM_ACTIVATEAPPIfm.WParam.ToInt32<>0ThenLabell.Text="窗體被激活!"ElseLabel1.Text="窗體被停用!"EndIf'窗體被激活時(shí),WParam屬性返回一個(gè)非零值CaseWM_NCHITTEST'鼠標(biāo)位于窗體上方時(shí)發(fā)送WM_NCHITTEST消息Ifm.Result.ToInt32=HTCLIENTThenm.Result=NewIntPtr(HTCAPTION)'修改消息值EndIfEndSelectEndSubEndClass此外,我們還可捕獲系統(tǒng)顏色改變、字體改變、窗體大小調(diào)整、Windows會(huì)話關(guān)閉等消息并進(jìn)行處理。要詳細(xì)了解Msg、LParam和Wparam等屬性,讀者可閱讀MSDNLibrary中的PlatformSDK文檔。3異形窗體及透明效果窗體具有一對(duì)十分有趣的屬性:Transparencykey和Opacity。如果將某種顏色值賦給Transparencykey屬性,則窗體上此種顏色覆蓋的區(qū)域?qū)⒈惶幚沓赏该鞯?,并且不能被繪制。用戶在這些地方單擊,會(huì)激活后面的窗體。因此我們只要使用不同于Transparencykey屬性的顏色值在窗體上繪制圖形,就可創(chuàng)建出形狀奇異的窗體,如三角形、圓形甚至五角星形的窗體??梢岳肎DI+在窗體上繪制圖形,也可通過(guò)任何的圖形軟件(如畫(huà)圖)來(lái)創(chuàng)建一個(gè)位圖,再將該位圖加載到窗體的BackgroundImage屬性。如果把窗體的FormBorderStyle屬性設(shè)置為None,去掉標(biāo)題欄和邊框,會(huì)獲得更好的效果。PrivateSubForm1_Paint(ByValsenderAsObject,ByValeAsSystem.Windows.Forms.PaintEventArgs)HandlesMyBase.PaintMe.TransparencyKey=Color.Blue'定義藍(lán)色為透明色DimbAsNewSolidBrush(Me.BackColor)'創(chuàng)建與窗體背景色同色的畫(huà)筆對(duì)象e.Graphics.FillRectangle(Brushes.Blue,Me.ClientRectangle)'用藍(lán)色畫(huà)一個(gè)覆蓋窗體的矩形e.Graphics.FillEllipse(b,Me.ClientRectangle)'用背景色畫(huà)一個(gè)實(shí)心橢圓e.Graphics.FillRectangle(Brushes.Blue,100,100,230,100)'用藍(lán)色在橢圓內(nèi)畫(huà)一個(gè)較小的矩形e.Graphics.DrawEllipse(Pens.Black,Me.ClientRectangle)'為橢圓加一條黑色的邊框b.Dispose()'取消畫(huà)筆對(duì)象EndSubPrivateSubButton1_Click(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesButton1.ClickDimopAsDoubleForop=Me.OpacityTo0Step-0.005Me.Opacity=opNext'實(shí)現(xiàn)窗體淡出效果MessageBox.Show("再見(jiàn)!”)EndEndSub顯然,不管如何定義窗體,都應(yīng)向用戶提供關(guān)閉和移動(dòng)窗體的功能。所以應(yīng)準(zhǔn)備一個(gè)按鈕用于關(guān)閉窗體,并結(jié)合前面介紹的窗體子類(lèi)派生技術(shù)實(shí)現(xiàn)移動(dòng)。Opacity屬性是一個(gè)0到1范圍內(nèi)的Double型數(shù)值,代表了整個(gè)窗體的透明性:為1時(shí),窗體表現(xiàn)為正常狀態(tài);為0時(shí),窗體完全透明。可以將該屬性用于淡入淡出等特殊效果。本例中,我們建立了一個(gè)橢圓形且中空的窗體,單擊按鈕后,窗體會(huì)逐漸透明變淡,最終消失,如圖2。(圖2:異形窗體)4本地化窗體當(dāng)我們需要開(kāi)發(fā)一個(gè)支持多語(yǔ)言界面的軟件時(shí),傳統(tǒng)的方法是使用資源文件,再編寫(xiě)提取各個(gè)字符串(或圖像)并應(yīng)用到界面中的代碼,顯然這種方式很難實(shí)現(xiàn)快速應(yīng)用程序開(kāi)發(fā)。在VB.NET中,窗體設(shè)計(jì)器用一種簡(jiǎn)潔高效的方法解決了這個(gè)問(wèn)題。圖3所示的窗體是程序的中文界面(默認(rèn)語(yǔ)言),包括一些中文字符串和一幅圖片。在完成后,我們就可以對(duì)應(yīng)設(shè)置其英文(或其他語(yǔ)言)的界面。(圖3:本地化窗體中文)

在屬性窗口將窗體的Localizable屬性設(shè)為T(mén)rue,表示要為窗體生成本地化代碼。接下來(lái)將窗體的Language屬性設(shè)置為希望支持的語(yǔ)言類(lèi)型(如英語(yǔ)),如圖4所示。皆Lau指矛Accep+ButtonC:diLcelEiittcirLKeyFrevi郁L-:屬性設(shè)置)L:irLgiiage英語(yǔ)辟建宜共和園}英語(yǔ)血勒比海)英語(yǔ)血掌犬:)英語(yǔ)n聿巴布韋)ImeMode日雜咬英語(yǔ)皆Lau指矛Accep+ButtonC:diLcelEiittcirLKeyFrevi郁L-:屬性設(shè)置)L:irLgiiage英語(yǔ)辟建宜共和園}英語(yǔ)血勒比海)英語(yǔ)血掌犬:)英語(yǔ)n聿巴布韋)ImeMode日雜咬英語(yǔ)(圖5:本地化窗體英文)本地化窗體的最大好處在于大多數(shù)情況下可以不去考慮它們,用戶像運(yùn)行一個(gè)普通程序一樣對(duì)待本地化窗體程序。如果用戶的系統(tǒng)語(yǔ)言與已定義的某種語(yǔ)言匹配,則程序窗體和控件將自動(dòng)使用為該語(yǔ)言所作的設(shè)置,否則,使用默認(rèn)設(shè)置。本地化窗體的測(cè)試是一個(gè)問(wèn)題:在一臺(tái)電腦上安裝多套系統(tǒng)是很麻煩的。較簡(jiǎn)單的方法是更改UI線程的區(qū)域設(shè)置,將適當(dāng)?shù)腃ultureinfo對(duì)象賦給Thread.CurrentThread對(duì)象的CurrentUICulture屬性來(lái)實(shí)現(xiàn)。我們需要在窗體的New()過(guò)程中設(shè)置它(打開(kāi)"Windows窗體設(shè)計(jì)器生成的代碼",在New過(guò)程中添加如下語(yǔ)句):PublicSubNew()MyBase.New()System.Threading.Thread.CurrentThread.CurrentUICulture=NewSystem.Globalization.CultureInfo("en-US")‘設(shè)置語(yǔ)言區(qū)域?yàn)橛⒄Z(yǔ)(美國(guó))InitializeComponent()EndSub運(yùn)行時(shí),用不同的區(qū)域代碼初始化窗體,窗體將自動(dòng)以匹配的效果顯示。區(qū)域代碼(如"en-US")可在MSDN中查得。5動(dòng)態(tài)控件屬性請(qǐng)看圖6所示的窗體:一個(gè)用于同數(shù)據(jù)庫(kù)進(jìn)行連接的登錄對(duì)話框。為了便于用戶的操作,在編程時(shí)已預(yù)定義了服務(wù)器名和用戶名。很顯然,如果采用給控件屬性直接賦值的方法,開(kāi)發(fā)者需要為每個(gè)用戶重新

編譯程序,這幾乎是不可能的。在.NET之前,一般用.ini文件實(shí)現(xiàn)此目的,而.NET中通過(guò)配置文件的動(dòng)態(tài)屬性,提供了一種更標(biāo)準(zhǔn)的解決方案。(圖6:動(dòng)態(tài)控件屬性窗體)設(shè)計(jì)窗體時(shí),選擇需要設(shè)置動(dòng)態(tài)屬性的控件(如TextBoxl),在“屬性”窗口中展開(kāi)DynamicProperties項(xiàng),單擊Advanced項(xiàng)旁的省略號(hào)按鈕,會(huì)出現(xiàn)如圖7所示的對(duì)話框。(圖7:設(shè)置動(dòng)態(tài)屬性的對(duì)話框)找到并選擇希望設(shè)為動(dòng)態(tài)的屬性(如本例中的Text屬性),確定后,.NET會(huì)自動(dòng)為程序創(chuàng)建一個(gè)配置文件“app.config”(文本文件),在文件的<appSettings>部分,包含了設(shè)置好的控件屬性名及對(duì)應(yīng)的屬性值。程序運(yùn)行時(shí),這個(gè)值將被讀出并作用在控件的動(dòng)態(tài)屬性上。編譯程序后, ^企目錄下會(huì)出現(xiàn)“程序名.exe.config”配置文件,用記事本打開(kāi)并修改相應(yīng)的屬性值,即可實(shí)現(xiàn)動(dòng)態(tài)控件屬性效果,如圖8。當(dāng)然,最好是在程序中由用戶來(lái)決定控件的動(dòng)態(tài)屬性值,編程者利用文件操作修改配置文件中的屬性值。文件實(shí)文件(!)編輯?格式(Q)查看@)幫助冬)文件實(shí)文件(?。┚庉?格式(Q)查看@)幫助冬)eloa)0白臼臼白臼臼0臼田ffiffiffiffiffiffiffiffiffia0FFICE2000PhotoCapTestDelphiTestSTestWToolVBBookVBProgram.FileTreeView『弓FileWatcher『七Fi1eWatcherPanel田ffia本地化窗體e色動(dòng)態(tài)控件屆性tjpbina£3objE國(guó)分頁(yè)王im異形窗體及透明效果<?xinlversion=//l.0〃encodings<configuration><appSettings><!— 改處顯示用戶應(yīng)用程序利配置的屬性設(shè)最-><I一一 不依":<addkey=//settingNaine//value=se11ingValue/>一一><addkey=??TextBoxl.Text"value=//SQLServerl>y/><addkey=/?TextBox2.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論