程式設計之路-介面美化 (轉)

worldblog發表於2007-12-11
程式設計之路-介面美化 (轉)[@more@]

  現在越來越多的都有了很Cool的2D造型,什麼×××× XP啦,×××× 2002之類的,看來爭奪軟體霸權的地位,2D介面是必不可少的,有很多人認為語言的先天不足導致它不能夠很靈活的改變介面,讓俺們來看看究竟吧。
  如果大家用過《大師》,肯定會被它的介面所傾倒,其實利用ActiveSkin 就可以辦到,甚至更爽,但是如果要做的共享軟體只是一個,在加上幾個OCX累贅,似乎很是不爽,看看VB是怎麼利用別的東東來實現的吧。
  首先新建一個EXE工程,再在窗體上拖幾個Label,看看Label 的強大功能吧,原理就是利用Label來模擬一個按鈕,但是首先要將Label控制元件的屬性要調一下,
Name:  LblBtn,
BorderStyle:  1,
Appearance:  0,
Alignment:  2,
這樣一個按鈕的雛形就已經出來了,如果工程量很大,可以將多個Label控制元件的Name屬性設為一樣的,對於按鈕的識別就要靠識別Index屬性了,為了方便起見,在進入到程式碼編輯視窗,輸入以下程式碼:
Private Const LBL_BACK_COLOR = &HE0E0E0  ’正常時Label控制元件的背景色
Private Const LBL_WHEN_MOUSE_MOVE = &HC0C0C0  ’滑鼠移動時Label的背景色
Private Const LBL_WHEN_MOUSE_DOWN = &H808080  ’滑鼠按下時Label的背景色
再在Form的Load事件中輸入以下內容
Private Sub Form_Load()
Dim Count As Integer
For Count = 0 To 3  ’請將此出的3換成你的LblBtn數量的個數-1
LblBtn(Count).BackColor=LBL_BACK_COLOR  ’初始化LblBtn的背景
Next Count
End Sub
然後再在LblBtn的MouseMove和MouseDown事件中來搞定剩餘部分:
Private Sub LblBtn_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) ’當滑鼠按在LblBtn上時
LblBtn(Index).BackColor = LBL_WHEN_MOUSE_DOWN  ’臨時改變LblBtn背景顏色
End Sub
Private Sub LblBtn_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)  ’滑鼠在LblBtn上面移動時觸發該事件
Dim Count As Integer
DoEvents  ’暫時將控制權教給系統
If Button Then Exit Sub ’如果按鈕被按下就退出該過程
For Count = 0 To 3
If Count <> Index Then ’如果按下的不是其它按鈕
LblBtn(Index).BackColor = LBL_BACK_COLOR ’將背景設為正常
Else
LblBtn(Index).BackColor = LBL_WHEN_MOUSE_MOVE ’將背景設為滑鼠移動的背景
End If
Next Count
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Count As Integer
DoEvents
For Count=0 To 3
LblBtn(Count).BackColor=LBL_BACKCOLOR ’恢復背景
Next Count
End
本來利用Windows的訊息系統來完成這一“艱鉅”的任務最簡單,可問題就來了,Label控制元件沒有視窗控制程式碼怎麼辦?可是此問題與題無關,寫了會有騙稿費之:)

OK,Label控制元件就講到這裡,在來說說TextBox控制元件,
各位看關恐怕看慣了白顏色的背景,那麼就換換顏色以養養俺們那和綿羊一樣的眼睛(為什麼說綿羊?俺也不知道),可是VB提供的RGB弄出來的顏色不是怎麼好看,這裡俺來教大家一個小Tip,RGB函式的Red,Green,Blue這三個引數若一樣,則產生的顏色是灰度,當然越接近白顏色越好,但也不能讓各位看不出來,俺建議TextBox的背景為RGB(235,235,235),各位還是實戰一下,將一個TextBox拖到窗體上,屬性設定如下
Appearance  0
BorderStyle  1
MutilLine  True
千萬不要設定ScrollBars屬性,否則會影響效果
在Form的Load事件中初始化TextBox
Dim bkColor As Long
Private Sub Form_Load()
bkColor=RGB(235,235,235)
Text1.BackColor=bkColor
End Sub
在Form和Text1的MouseMove事件中:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.BorderStyle = 0
End Sub
Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
DoEvents
Text1.BorderStyle = 1
End Sub
在按下F5試試是不是很Cool?
可能各位看關玩過石器時代,一定會對裡面的TextBox的效果感到很爽,VB還不是可以做到,有焦點的控制元件可以使用SetFocus方法來為其設定焦點,可是一個窗體上如果控制元件太多了,一個一個的用SetFocus是不是太傻了?這一節的主角就是--------函式,
首先宣告:
Private Type POINTAPI
  x As Long
  y As Long
End Type
Private Declare Function GetCursorPLib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
但是這裡的SetFocus會和控制元件的SetFocus會搞混淆,改改吧,
Private Declare Function nSetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
只要Alias指向的介面是對的前面的函式名稱簡直就是擺設,
在建立一個過程:
Public Function sSetFocus() As Long
Dim CPos As POINTAPI,Succesull As Boolean,hWnd As Long
DoEvents
Successfull =GetCursorPos(CPos)
If Not Successfull Then Exit Sub ’如果未成功則退出該過程
hWnd=WindowFromPoint(CPos.x,CPos.y)
sSetFocus=nSetFocus(hWnd)
End Sub
在窗體上放一個Timer控制元件,Interval 屬性設為100,就是0.1秒,在Timer1控制元件的Timer事件中填入sSetFocus,在執行一下看看,效果怎麼樣?
可是有的先生小姐要問了,TextBox難道就不能用ScrollBar嗎?非也非也,選 工程->部件-> Windows Common Controls-2 6.0 (SP3)就是你的答案,至於捲動TextBox就去研究SendMessage函式吧,否則又有騙稿費之嫌,如果想作綠色軟體,不想用控制元件,可以用俺前面講到的Label控制元件,利用字型 dings 來模擬ScrollBar,需要注意的是,如果模擬ScrollBar,上下左右箭頭分別是5,6,3,4,別忘了把字型設為Webdings

再來講講窗體的美化,其實將BorderStyle屬性設為0就是很好的2D美化;)可是,這樣一來,問題又來了,怎麼辦?凡事都要請API來幫忙,這裡需要兩個API,一下是該API的宣告:
Public Declare Function ReleaseCapture Lib "user32" Alias "ReleaseCapture" () As Long  '這個API是用來解下滑鼠的追蹤器,關於他的過多用法以及詳細介紹可以寫信向俺諮詢,
還有
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long’這個該不要俺多介紹了吧
Public Const HTCAPTION = 2  ’代表窗體的標題區
Public Const WM_NCLBUTTONDOWN = &HA1 ’表示非工作區左鍵按下
原理很簡單,卸下滑鼠追蹤器後向Form傳送一個移動窗體的訊息,其實做到這一點的方法很多,但俺個人認為這一種最簡單,新增一個過程:
Public Sub MoveForm(hWnd As Long)
DoEvents
ReleaseCapture
SendMessage hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End Sub
在Form的MouseMove事件中:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button=vbLeftButton Then MoveFohWnd’如果按下滑鼠左鍵就移動窗體
End Sub
臺下的這位小姐又納悶了,可是光禿禿的窗體沒有了標題欄也不好看,俺要向這為小姐推薦俺的東東-控制元件,ToolSign,需要的人可以寫信給俺聯絡,
該控制元件需要在程式碼編輯區域內新增一下程式碼:
’一下宣告是用在ToolSign的 AutoQuit屬性的
Public Const EXIT_FORCE = 2  ’注意,在VB中執行的時候如果選用此退出方式,VB也會退出
Public Const EXIT_MESSAGE = 1 ’由傳送關閉訊息
Public Const EXIT_CUSTOM = Not (EXIT_FORCE Or EXIT_MESSAGE) ’自定義
將其註冊後在部件欄中把e-Dogkid Studio Tools Sign打鉤,新增到工具箱中,雙擊加入到窗體中,
在Form的Load事件中新增一下初始化程式碼:
Private Sub Form_Load()
With Sign1
.AutoQuit = EXIT_CUSTOM
.ParentsHWND = hWnd  ’填了此屬性可以直接用ToolSign來移動窗體而不需要前面的程式碼
End With
End Sub
Sign1的Click事件
Private Sub Sign1_Click()
End ’關閉
End Sub
在Form的Resize事件中新增一下程式碼:
Private Sub Form_Resize()
Sign1.Width = Width
End Sub
如果想讓窗體可以改變大小,可以修改一下屬性
Caption  ""
BorderStyle 2或5
ControlBox False
實際情況如圖


不知道各位看關見過爆炸試的窗體沒有?,沒有見過可以從俺要另外一個俺自己的ActiveX DLL,我的那個東東其實是給我的Software作執行庫的,各位若不嫌棄,可以用用,註冊後在工程->引用->e-Dogkid Runtime Library
然後在窗體Load事件中輸入:
Private Sub Form_Load()
Dim System As e_Dogkid_Runtime_Library.System
Set System = New e_Dogkid_Runtime_Library.System
Show
System.BoomIt hDC, 60, Width, Height, Left, Top
Set System = Nothing
End Sub
其實俺的那個DLL檔案有幾百個俺自己收集和自己編寫的函式,很棒的.
另外俺的qq號碼:16184794,俺的e是e-


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991183/,如需轉載,請註明出處,否則將追究法律責任。

相關文章