1. 程式人生 > >病毒檢測與防毒技術大揭祕10

病毒檢測與防毒技術大揭祕10

3.7.防毒軟體介面設計

從某種角色而言,軟體介面比功能更為重要,當然這是針對使用者的。介面是軟體的門面,會帶給使用者第一使用感受,如果軟體介面做的很糟糕,使用者用過一次便不想再看,那麼即便是軟體功能再強大,使用者也不會想使用。

在當下流行的各種開發工具中,都會提供各種功能控制元件,但這些控制元件風格都比較陳舊,按鈕永遠都是一個單色的小方塊、文字框永遠都有醜陋的下陷邊框等等。當然是有第三方的介面控制元件可以使用,但其對開發環境的要求往往比較苛刻、會增加一定額外的程式碼量、控制元件內部功能對開發者不透明、會引起軟體意外的錯誤、不能完全滿足開發時隨心所欲的需求等等。那麼在這一章,我們將解決這一問題,介紹一種軟體介面設計方面的技巧和相關的程式設計方法,提供給大家一種全新的介面設計思路。

3.7.1.漂亮介面的設計技巧:圖片替換控制元件法 說到全新,其實也不能稱的上是全新,只是一種技巧,只大多數人通常在不經意見忽視了它,沒有發現它的價值。簡單的說,就是大量使用圖片來取代和裝飾原來控制元件。

比如:去掉介面的邊框,使用一張背景圖來做為新的介面,在此圖的基礎上再次放置圖片來替代介面固有的最大化、最小化、退出按鈕。為了實現按鈕在移動和按下的效果,可以做三組不同的圖片,分別用來顯示按鈕在普通狀態下的效果、滑鼠移動到上面時的效果和滑鼠按下後的效果。再在程式碼中圖片感應到的事件函式中對圖片做不同的顯現控制、位置控制元件,這樣就可以實現完美替換原有按鈕的功能,又能達一美化介面的功效。

下面付上一段對介面中關閉按鈕進行圖片替代的編碼方法:

首先在介面中放置三個圖片,做了編碼方法,使用陣列的方式對其進行命名,分別為:ImageExit(0)、ImageExit(1)、ImageExit(2)

ImageExit(0)中貼入按鈕普通狀態下圖片,ImageExit(1)中貼入滑鼠移動到上面後的圖片,ImageExit(2)中貼入按鈕被按下後的狀態圖片。

然後進行編碼:

在窗體載入函式中: Private Sub Form_Load() Dim i As Long For i = 0 To 2 初始化關閉銨鈕圖片位置 With ImageExit(i) .Left = 3480 .Top = 0 End With Next

設定各圖片的可見狀態 ImageExit(0).Visible = True ImageExit(1).Visible = False ImageExit(2).Visible = False End Sub

這樣,窗體載入後,使三個圖片的位置重疊在一起,而且控制隱藏掉兩個圖片,只顯示一個普通狀態下的圖片。在使用者看起來,就會只是一個按鈕。

然後在其它圖片事件中,再對按鈕的顯現做調整,以模擬正常關閉按鈕對滑鼠的響應:

滑鼠在圖片上移動時: Private Sub ImageExit_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) ImageExit(0).Visible = False ImageExit(1).Visible = True ImageExit(2).Visible = False End Sub

滑鼠按下時: Private Sub ImageExit_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) ImageExit(0).Visible = False ImageExit(1).Visible = False ImageExit(2).Visible = True End Sub

滑鼠擡起時,執行關閉操作 Private Sub ImageExit_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) Unload Me End Sub

由於是文字介紹,這部分功能無法直接的效果顯現給讀者,需仔細思考加實踐方可理解此法之妙、效果之好。

這裡只是演示了關閉按鈕的圖片替代法,其它各種功能控制元件,也可以使用類似的方法進行美化、替換。

3.7.2.圖片替換法的高階應用:介面換膚

因為圖片用圖片代替了控制元件,而使用的圖片恰恰是可以控制的,那麼在此技術的基礎上,我們可以實現很多人夢寐以求的高階介面技術:介面換膚。

在圖片替換法的基礎上,介面換膚的實現非常簡單:在上面的介紹中,關閉按鈕的圖片是事先貼好在圖片中的,在此我們只需動態的替換圖片中的圖片源,即可實現介面換膚。同樣以關閉按鈕為例來演示:

在窗體載入函式中: Private Sub Form_Load() ImageExit(0).Picture = LoadPicture(App.Path & “\Skin_01\Exit0.bmp”) ImageExit(1).Picture = LoadPicture(App.Path & “\Skin_01\Exit1.bmp”) ImageExit(2).Picture = LoadPicture(App.Path & “\Skin_01\Exit2.bmp”)

Dim i As Long
For i = 0 To 2
    初始化關閉銨鈕圖片位置
    With ImageExit(i)
        .Left = 3480
        .Top = 0
    End With

Next

設定各圖片的可見狀態 ImageExit(0).Visible = True ImageExit(1).Visible = False ImageExit(2).Visible = False End Sub

同樣是在窗體載入函式中,只需新增三行程式碼,不嚴格的說,只需一行:

ImageExit(0).Picture = LoadPicture(App.Path & “\Skin_01\Exit0.bmp”)

即可實現膚換,其它圖片對事件的響應程式碼不變,依然是使用上面的程式碼。

這行程式碼的功能是當窗體載入時,對圖片控制元件中的圖片進行載入,在這裡是使用了檔案: App.Path & “\Skin_01\Exit0.bmp”,也就是軟體目錄中Skin_01目錄下的Exit0.bmp檔案,

要換膚時,只需更改此檔案的路徑即可,比如使用另一目錄下的檔案: App.Path & “\Skin_02\Exit0.bmp”

然後顯現在圖片中的將會是另一張圖,對使用者而言,將會是另一個軟體介面。

3.7.3.掃描自定義目錄介面的實現

這個功能是防毒軟體所必備的,進行自定義掃描時,必須提供給使用者選擇不同驅動器、目錄的選擇權。實現這個功能,我們使用TreeView樹型控制元件,但TreeView控制元件原本並沒有這個功能,為了達到預期的需求,這裡需要使用眾多的技巧,這一部分功能程式碼用於演示使用程式設計技巧擴充控制元件原有功能的實現。

我們的預期目標是:在TreeView控制元件中,顯示出計算機上所有的驅動器;在開啟不同的驅動器及目錄時,能夠顯示它的下級目錄;在選中或取消選中某一節點時,控制元件能自動選中和取消選中該節點的子節點,但不影響父節點。介面效果如下: 在這裡插入圖片描述 假設已經在窗體中使用了TreeView控制元件,名稱為:TreeViewScanTarget,功能實現程式碼如下:

Private Sub Form_Load()

窗體載入時,獲得系統所有碟符並新增到控制元件中進行顯示
TreeViewScanTarget.Nodes.Add , , "Lord", "我的電腦", 1
Dim sDrive As String
sDrive = String(256, Chr(0))
Dim sDriveID As String
Call GetLogicalDriveStrings(256, sDrive)
Dim i As Long
For i = 1 To 100 Step 4
sDriveID = Mid(sDrive, i, 3)
TreeViewScanTarget.Nodes.Add "Lord", tvwChild, sDriveID, Left(sDriveID, 2), 2
Next i

設定根節為選中狀態
TreeViewScanTarget.Nodes(1).Checked = True

設定根節為展開狀態
TreeViewScanTarget.Nodes(1).Expanded = True

設定子節選中狀態
CheckChildNodes TreeViewScanTarget.Nodes(1)
CheckParentNodes TreeViewScanTarget.Nodes(1)

End Sub

Treeview控制元件單擊事件處理函式 Private Sub TreeViewScanTarget_Click() CheckChildNodes TreeViewScanTarget.SelectedItem CheckParentNodes TreeViewScanTarget.SelectedItem End Sub

Treeview控制元件節點單擊事件處理函式 Private Sub TreeViewScanTarget_NodeClick(ByVal Node As MSComctlLib.Node)

轉移Treeview中節點的焦點
CheckChildNodes TreeViewScanTarget.SelectedItem
CheckParentNodes TreeViewScanTarget.SelectedItem

End Sub

Treeview控制元件節點展開事件處理函式,功能是:獲取節點所對應的子目錄,增加子節點 Private Sub TreeViewScanTarget_Expand(ByVal Node As MSComctlLib.Node)

如果Treeview無內容則退出
If TreeViewScanTarget.Nodes.Count = 0 Then Exit Sub

Dim i As Long

如果選中的節點無子節點
If Node.Children = 0 Then
Call GetSubFolders(TreeViewScanTarget, Node)

如果有子節點
Else
Dim uNode As Node
    
節點的第一子節點
Set uNode = TreeViewScanTarget.Nodes(Node.Index).Child
    
遍歷所有子節點
For i = 1 To Node.Children
        
DoEvents
如果子節點沒有子節點,則取子節點的下級目錄,增加子節點

If uNode.Children = 0 Then
Call GetSubFolders(TreeViewScanTarget, uNode)
End If
Set uNode = uNode.Next
        
Next
End If

End Sub

處理子節點選中狀態 Private Function CheckChildNodes(ByVal Node As MSComctlLib.Node) Dim i As Long Dim uChildNode As Node

如果沒有子節點,則退出
If Node.Children = 0 Then
Exit Function
End If

If Node.Checked = True Then

選中
Set uChildNode = Node.Child
For i = 1 To Node.Children
uChildNode.Checked = True
If uChildNode.Children <> 0 Then
CheckChildNodes uChildNode
End If
Set uChildNode = uChildNode.Next
Next
    
Else
Set uChildNode = Node.Child
For i = 1 To Node.Children
uChildNode.Checked = False
If uChildNode.Children <> 0 Then
CheckChildNodes uChildNode
End If
Set uChildNode = uChildNode.Next
Next
End If    

End Function

處理父節點選中狀態 Private Function CheckParentNodes(ByVal Node As MSComctlLib.Node) Dim i As Long Dim uParentNode As Node

同層node個數
Dim lSameLevelNodes As Long
Dim uSameLevelNode As Node

如果沒有子節點,則退出
If Node.Root = Node Then
    Exit Function
End If

If Node.Checked = True Then
Set uParentNode = Node.Parent
uParentNode.Checked = True
   
Do While uParentNode <> Node.Root
Set uParentNode = uParentNode.Parent
uParentNode.Checked = True
Loop
Else


檢查是否同級節點都是不選中狀態
If Node.Parent.Children > 0 Then
lSameLevelNodes = Node.Parent.Children
Set uSameLevelNode = Node.Parent.Child
For i = 1 To lSameLevelNodes
If uSameLevelNode.Checked = True Then
Exit Function
End If
Set uSameLevelNode = uSameLevelNode.Next
Next
End If
    
不選中
Set uParentNode = Node.Parent
uParentNode.Checked = False
    
Do While uParentNode <> Node.Root
Set uParentNode = uParentNode.Parent
uParentNode.Checked = False
Loop
End If

End Function

Treeview控制元件中節點選中及反選事件 Private Sub TreeViewScanTarget_NodeCheck(ByVal Node As MSComctlLib.Node)

轉移Treeview中節點焦點
TreeViewScanTarget.SelectedItem = Node

處理節點選中狀態
CheckChildNodes Node
CheckParentNodes Node

End Sub

取得目錄或驅動器下子目錄,引數:uTreeView,放置目錄的Treeview控制元件;uParentNode:Treeview選中節點,包含檔案路徑,本函式即取該目錄下的子目錄 Public Function GetSubFolders(uTreeView As Control, ByVal uParentNode As Node)

Dim sPath As String
 
檢查最後字母是否是“\”,Treeview以"\"分隔每個節點,所以:“我的電腦”+“\”長度為5
If Right(uParentNode.FullPath, 1) <> "\" Then
sPath = Right(uParentNode.FullPath, Len(uParentNode.FullPath) - 5) & "\"
Else
sPath = Right(uParentNode.FullPath, Len(uParentNode.FullPath) - 5)
End If

Dim lRet As Long
Dim uWFD As WIN32_FIND_DATA

查詢目錄下檔案
lRet = FindFirstFile(sPath & "*.*" & Chr(0), uWFD)
If lRet <> -1 Then

不為.或..且是目錄
If (TrimNull(uWFD.cFileName) <> ".") And (TrimNull(uWFD.cFileName) <> "..") And (uWFD.dwFileAttributes And vbDirectory) Then

增加子節點,新增目錄
Call uTreeView.Nodes.Add(uParentNode.Key, tvwChild, sPath & TrimNull(uWFD.cFileName), TrimNull(uWFD.cFileName), 7)
End If
        
While FindNextFile(lRet, uWFD)

不為.或..且是目錄
If (TrimNull(uWFD.cFileName) <> ".") And (TrimNull(uWFD.cFileName) <> "..") And (uWFD.dwFileAttributes And vbDirectory) Then
增加子節點,新增目錄

Call uTreeView.Nodes.Add(uParentNode.Key, tvwChild, sPath & TrimNull(uWFD.cFileName), TrimNull(uWFD.cFileName), 7)
End If
wend
End If
Call FindClose(lRet)

End Function

3.8.其它輔助功能設計

之前幾章中,出理條理和易懂的目的,對各內容的介紹是以功能為模組進行分類單獨講述的,因此有許多本該穿插在其中功能未做到講解。在本章中將對這些重要的未講解到的功能再做單獨介紹。

注:作者:wing qq:6465660 本書理論及功能、程式碼源於防毒軟體:“Ty2y防毒軟體”,作者授意,文章可自由轉載,只需註明原出處即可,特此說明。