深入討論VB.NET設(shè)置控件
VB.NET經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展,很多用戶都很了解VB.NET設(shè)置控件了,這里我發(fā)表一下個(gè)人理解,和大家討論討論。個(gè)人都不希望在別人的身上發(fā)現(xiàn)有與自己的相同之處。作為計(jì)算機(jī)軟件來(lái)說(shuō)也是一樣,每一個(gè)用戶都希望自己使用的軟件與別人不一樣,于是誕生了換膚技術(shù)。用戶可以根據(jù)自己的喜好來(lái)選擇不同的界面,從而實(shí)現(xiàn)了個(gè)性化的設(shè)置。但是換膚技術(shù)有一個(gè)不足之處,那就是所有的皮膚都是由開(kāi)發(fā)者預(yù)先提供的,而且數(shù)量有限。這就導(dǎo)致了有些用戶使用的皮膚會(huì)和另一些用戶使用的皮膚相同,從而違背了設(shè)計(jì)者的初衷。雖然有些讀者會(huì)說(shuō),開(kāi)發(fā)商現(xiàn)在提供了下載服務(wù),可以從它們的網(wǎng)站下載更多的皮膚供用戶選擇,可是從我的使用中發(fā)現(xiàn)這些皮膚依然是有限的,而且對(duì)于沒(méi)有條件上網(wǎng)的用戶來(lái)說(shuō)這種服務(wù)是毫無(wú)價(jià)值。
作為一個(gè)軟件開(kāi)發(fā)人員,當(dāng)一種技術(shù)已經(jīng)無(wú)法滿足用戶的需要的時(shí)候就該開(kāi)動(dòng)腦筋,想想是否可以從另一種角度來(lái)思考問(wèn)題的答案。在這個(gè)前提下,通過(guò)本人的思考終于想出了一個(gè)新的方法,我將它稱為--交互界面。使用這種技術(shù)可以保證在全球范圍內(nèi)不會(huì)出現(xiàn)相同的界面結(jié)構(gòu),從而完全實(shí)現(xiàn)個(gè)性化。
其實(shí)要實(shí)現(xiàn)這種界面在技術(shù)方式上并沒(méi)有太高的要求。實(shí)現(xiàn)原理就是:讓用戶自己調(diào)整每一個(gè)控件的位置然后保存這些控件在界面上的坐標(biāo)位置。在以后啟動(dòng)這個(gè)程序的界面時(shí)讀取這些值,用這些值來(lái)VB.NET設(shè)置控件在界面中的位置。下面的代碼就是為實(shí)現(xiàn)這個(gè)功能而設(shè)計(jì)的(用VB.NET編寫)
- Private Sub Form1_MouseUp(ByVal sender As Object,
- ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
- Dim x, y
- x = e.X
- y = e.Y'獲得新的x,y的坐標(biāo)
- If Button1.Enabled = False Then
- Button1.Top = y
- Button1.Left = x'坐標(biāo)替換
- End If
- If TextBox1.Enabled = False Then
- TextBox1.Top = y
- TextBox1.Left = x
- End If
- End Sub
- Private Sub MenuItem2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MenuItem2.Click- Button1.Enabled = False'禁止控件響應(yīng)事件
- If TextBox1.Enabled = False Then
- TextBox1.Enabled = True
- End If
- End Sub
- Private Sub MenuItem3_Click(ByVal sender As System.Object,
- ByVal e As System.EventArgs) Handles MenuItem3.Click
- TextBox1.Enabled = False
- If Button1.Enabled = False Then
- Button1.Enabled = True
- End If
- End Sub
- Private Sub MenuItem4_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MenuItem4.Click- TextBox1.Enabled = True
- Button1.Enabled = True
- '將新的坐標(biāo)保存到文本文件中
- If IO.File.Exists("c:\k.txt") = True Then
- IO.File.Delete("c:\txt")
- Dim sw As IOIO.StreamWriter = IO.File.CreateText("c:\k.txt")
- Dim cstringt, cstringl As String
- Dim tstringt, tstringl As String
- cstringt = Button1.Top
- cstringl = Button1.Left
- tstringt = TextBox1.Top
- tstringl = TextBox1.Left
- sw.WriteLine(cstringt)'寫入新坐標(biāo)到文本文件中
- sw.WriteLine(cstringl)
- sw.WriteLine(tstringt)
- sw.WriteLine(tstringl)
- sw.Close()
- Else
- Dim sw As IOIO.StreamWriter = IO.File.CreateText("c:\k.txt")
- Dim cstringt, cstringl As String
- Dim tstringt, tstringl As String
- cstringt = Button1.Top
- cstringl = Button1.Left
- tstringt = TextBox1.Top
- tstringl = TextBox1.Left
- sw.WriteLine(cstringt)
- sw.WriteLine(cstringl)
- sw.WriteLine(tstringt)
- sw.WriteLine(tstringl)
- sw.Close()
- End If
- MsgBox("當(dāng)前界面已經(jīng)保存")
- End Sub
- Private Sub Form1_Load(ByVal sender As Object,
- ByVal e As System.EventArgs) Handles MyBase.Load
- If IO.File.Exists("c:\k.txt") = True Then
- Dim sr As IOIO.StreamReader = IO.File.OpenText("c:\k.txt")
- Dim input1, input2, input3, input4 As String
- input1 = sr.ReadLine
- input2 = sr.ReadLine
- input3 = sr.ReadLine
- input4 = sr.ReadLine'讀取文件中的坐標(biāo)
- Button1.Top = input1
- Button1.Left = input2
- TextBox1.Top = input3
- TextBox1.Left = input4'用文件中的值來(lái)初始化控件在界面中的位置
- sr.Close()
- End If
- End Sub
程序說(shuō)明:在MenuItem4_Click 是在調(diào)整控件之后將控件的新位置保存到c;\k.txt文件中。form_load中的if作用是,如果是沒(méi)有VB.NET設(shè)置控件的新位置在初始化是將不會(huì)發(fā)現(xiàn)c;\k.txt文件,從而使用默認(rèn)的參數(shù)來(lái)指定控件的位置。如果是有c;\k.txt文件存在就讀取其中的參數(shù)來(lái)初始化控件的位置。在Form1_MouseUp中通過(guò)點(diǎn)擊窗口中的位置來(lái)獲得新的坐標(biāo),使控件移動(dòng)到此坐標(biāo)處。對(duì)于Enabled屬性的使用是為了使控件在移動(dòng)時(shí)不響應(yīng)如click等的事件。
本文移動(dòng)的控件是textbox和button兩個(gè)控件,你可以按照本文提出的方法加入更多的控件,從而實(shí)現(xiàn)千人千面。
其實(shí)本人寫這篇文章的一個(gè)主要目的是為了說(shuō)明一個(gè)程序員不但要掌握牢固的技術(shù),同時(shí)還要有創(chuàng)新的思想。正如國(guó)外的分析家指出"微軟的成功在很大的程度上是依靠它的創(chuàng)新思維",所以希望讀了此文的讀者在以后的開(kāi)發(fā)過(guò)程中不要墨守成規(guī)!
【編輯推薦】