現在我們要講解預覽螢幕保護程式的部份了,首先我們先看螢幕保護設定視窗的測試,
看它做了些什麼
Private Sub cmdTest_Click()
'Check FileName Error ,Run Screen Saver Test
'BackUP Set Value,When Test Over,Restore the Set Value
If txtProFileName.Text = "" Then
MsgBox "請以瀏覽指定欲測試的螢幕保護程式", vbInformation & vbOKOnly
Exit Sub
End If
Dim i%, s$
ProFileTemp = txtProFileName.Text
ActiveType = ProgramTest
DoEvents
i% = EffectBuffer
s$ = picName$
frmActive.Show 1
EffectBuffer = i%
picName$ = s$
End Sub
先Check使用者有沒有選取設定檔,然後將螢幕保護程式的動作形態ActiveType設為ProgramTest
-預覽,接者,因為執行螢幕保護程式時會更改到EffectBuffer及PicName的值,所以我們還要
設定一個變數,將它的值儲存起來,這裡作者又少做一件事了...ProFile的值作者忘記存起來了
...請設定一個陣列,將ProFile作備份,然後叫出螢幕保護程式的動作視窗,最後在執行結束時
將變數設定回去就行了。接者,我們再回到動作視窗看一下cmdStart的程式
Private Sub cmdStart_Click()
If ....' 略
ElseIf ActiveType = ProgramTest Then
Call LoadSPMData(ProFileTemp$)
If ActiveType <> DefaultAction Then ActiveType = Active_Start
tmrActive.Interval = 250
tmrActive.Enabled = True
Exit Sub
End If
'略
End Sub
我們同樣先呼叫LoadSPMData來把設定檔的資料載入,傳入剛才在設定視窗指定的設定檔名,
如果沒有錯誤的話,將ActiveType改為Active_Start,因為接下來的動作與實際Run螢幕保護
程式就沒有什麼不同了,我又懶得多寫程式Check,所以乾脆將它改為Active_Start,那麼,
到此為止,整個螢幕保護程式就算講解完畢了,接下來要補講之前跳過的部份
一、檔案對話盒
二、字型對話盒
三、桌布的設定
四、圖型的特效處理
我們就先從檔案對話盒開始,先看Form_Load的處理
Private Sub Form_Load()
'Set Default Path,Check Load File Type then Set File1's Pattern,Draw From's BackGround
Drive1.Drive = App.Path
'略
Select Case FileDialogType
Case FILE_DIALOG_SAVE
Me.Caption = "儲存檔案"
File1.Pattern = "*.SPM"
'略
End Select
Call SetDrivePath
picBkGround.AutoRedraw = True
dx% = 0
dy% = 0
Do Until dx% > Me.ScaleWidth
rc = BitBlt(Me.hdc, dx%, dy%, picBkGround.Width, picBkGround.Height, picBkGround.hdc, 0, 0, SRCCOPY)
dy% = dy% + picBkGround.Height
If dy% > Me.ScaleHeight Then
dy% = 0
dx% = dx% + picBkGround.Width
End If
Loop
picBkGround.AutoRedraw = False
End Sub
這裡作一些初始的設定動作,將Drive設定好、Form置中、依FileDialogType來指定瀏覽的檔名
、在以SetDrivePath取得上次瀏覽的路徑,最後再為Form畫上背景就好了。畫背景非常簡單,
從左上的地方一路往下填滿圖形,超過了Form的寬度再將dy歸零,dx則往右遞增,一直到超出From
本身的寬度為止,如果懂得BitBlt使用的方法,大概就瞭解我的意思了。
接者就是Drive_Change及Dir_Change的處理,這裡的處理也都一樣,不過我忘了Drive_Change的
錯誤處理,參照設定視窗的作法加上去就行了,再來就是使用者確定輸入檔名的確認,使用者
Double Click FileList Box或在輸入文字框按下Enter或按下確定鍵都算,三邊的程式都一樣
我們挑一邊看就行了
Private Sub cmdOK_Click()
'Check "*" and "?" Word If True then Set File1's Pattern,Flase Then CheckFileType
If (InStr(1, txtFileName.Text, "*") <> 0) Or (InStr(1, txtFileName.Text, "?") <> 0) Then
File1.Pattern = txtFileName.Text
Exit Sub
Else
Call CheckFileType
End If
End Sub
首先我們要Check使用者有沒有輸入*或?這兩個特殊字元,如果有的話,他要做的就不是確定這個
輸入的檔名,而是改變FileList Box所瀏覽的檔案名稱,因此我們就把File1的Pattern屬性改成
使用者輸入的文字就行了(作者這裡又寫錯一個地方了,先自己想想看,等會再回頭討論),
如果不是包含這兩個特殊字元的話,我們就要Check使用者輸入的檔名格式有沒有問題,這裡我們
來看一下CheckFileType這個副程式
Private Sub CheckFileType()
Dim xFile As String
'Check FileDialog Type,Then Save or Load File
'If Music Load then Stop Music,and ReSet MusicStatus
Select Case FileDialogType
Case FILE_DIALOG_SAVE
xFile$ = CheckSaveFile
If xFile$ <> "" Then Call SaveFileOK(xFile$)
Case FILE_DIALOG_LOAD
xFile$ = CheckLoadFile()
If xFile$ <> "" Then Call LoadFileOK(xFile$)
Case FILE_DIALOG_LOAD_MIDI
xFile$ = CheckLoadFile()
If xFile$ <> "" Then
'略
End If
Case FILE_DIALOG_LOAD_WAV
xFile$ = CheckLoadFile()
If xFile$ <> "" Then
'略
End If
End Select
End Sub
這裡依開啟檔案的類別,分為四種類型來處裡,而現在要做的檔案的Check則又分為Load與Save兩
種情形來處理,我們先來看CheckLoadFile,如果CheckLoadFile檢查輸入的檔名沒有問題的話,
就傳回檔案的完整路徑,否則就傳回空字串,檢查輸入的檔名步驟有點煩,我們一步一步來看
,請自己打開CheckLoadFile這一段程式來對照,
If Trim$(txtFileName.Text) = "" Then
MsgBox "沒有輸入檔名", 64, "錯誤"
Exit Function
End If
xPath$ = Dir1.Path
If Right$(xPath$, 1) <> "\" Then xPath$ = xPath$ & "\"
先作最簡單的處理,使用者有沒有輸入任何字,在這裡有一點基本的概念要說明一下,
判斷使用者有沒有輸入字串時,除非你限制了空白鍵的輸入或根本不在乎輸入的內容,
否則請用Trim(字串)來判斷使用者到底有沒有輸入,不要直接用If 字串 = ""來判斷,
因為空白也算是有字串的存在,那麼後面的程式就會出錯了,這個基本的觀念一定要記住。
接者我們再取得Dir的路徑,等一下作判斷的時候會用到,接者往下看
For i% = 1 To Len(txtFileName.Text)
If Mid$(txtFileName.Text, i%, 1) = "\" Then pathFlag = True
If Mid$(txtFileName.Text, i%, 1) = "." Then
If i% = 1 Then
MsgBox "檔名輸入的第一個字元不可為 '.' ,請重新輸入", 64, "錯誤"
Exit Function
End If
dotFlag = True
End If
Next i%
If pathFlag = True Then
X$ = txtFileName.Text
Else
X$ = xPath$ & txtFileName.Text
End If
這裡要判斷使用者有沒有輸入路徑字元"\"和".",只要從第一個字元往下搜就可以了,
至於"..\"這一類的輸入法則被我排除在外了,因為還要再作多一層的Check,懶的作了...
那麼如果使用者有輸入路徑符號的話,又劃分為兩種情形,第一種寫法是"\Data\Abc.SPM",
代表使用者輸入的是完整的檔名了,第二種則是"Demo\Abc.SPM",代表的則是Dir的路徑再加上
"Demo\Abc.SPM"才是正確的檔名,喔!你沒看錯,我又寫錯了,又少一個判斷了,所以當你搜到
"\"這個字元時記得要存一個變數判斷是不是在第一個字,最後在依此判斷檔案的完整名稱,
最後一種情形,沒有找到"\"這個字元,那麼檔案名稱就是Dir的路徑加上使用者輸入的檔名了,
接者要判斷這個檔名的正確性
If dotFlag = True Then
If Dir(X$) <> "" Then
CheckLoadFile = X$
Else
MsgBox "找不到檔案 " & X$, 64, "錯誤"
End If
Else
If Dir(X$) <> "" Then
CheckLoadFile = X$
Else
Select Case FileDialogType
Case FILE_DIALOG_LOAD, FILE_DIALOG_SAVE
X$ = X$ & ".SPM"
'略
End Select
If Dir(X$) <> "" Then
CheckLoadFile = X$
Else
MsgBox "找不到檔案 " & X$, 64, "錯誤"
End If
End If
End If
這裡我們要依使用者有沒有輸入副檔名來判斷檔名的正確性,如果使用者有輸入檔名的話比較單
純,用Dir判斷,找到就是找到,沒有就是沒有,很簡單。至於使用者沒有輸入副檔名的話,
先判斷這樣的檔案存不存在,如果不存在,再依開檔的類型為檔案加上標準的副檔名,如果還是找
不到,才告知檔案不存在的訊息,最後再告訴你們一件事,這個檢查只能防君子而已,如果使用
者輸入的一堆奇奇怪怪的特殊字元的話還是會出錯的(看輸入的是什麼,不一定會有錯),像這種
情形只有借助On Error敘述來跳過了,當然,我這裡沒有寫,請自行補上,接者再回頭看"*"和"?"
的處理,有想到那邊有問題了嗎?答案是 - 特殊字元的處理,像是 "..\"、"\"等字元,如果直
接將這種字串套用到Pattern屬性會出錯的,處理的要訣和剛才的Check差不多,如果懶得作的,
就直接使用On Error這個方法了。如果檔案的輸入沒有任何問題的話,那麼就依開檔的類別作載
入或儲存的工作,這一個自己看就行了,而CheckSaveFile的地方就比較簡單了,只要作前半段
判斷檔案輸入的格式正確就可以了
後記
這次大概就講解到此了,很重要的一點提醒一下大家,如果不是閒閒沒事或者像作者一樣臨時
花轟的話,一定、必定、絕對請要使用VB內建的物件就好了,本來以為已經寫O.K.了,結果
還是.........,VB好用的其中一個優點就是支援的物件一堆,除了想研究以外,千萬不要沒事
學作者沒事找事作,會跟作者一樣,下場很...@!%#$!!的.....
下次見!!
回到VB教學教室
|