700 likes | 934 Views
新觀念的 VB6 教本. 第 16 章 螢幕保護程式. 螢幕保護程式,入門式 (1). 螢幕保護程式怎麼製作呢?首先讓我們來檢視 Windows 所提供的螢幕保護程式,請利用檔案總管搜尋 Windows 及 WindowsSystem 目錄底下的 . scr 檔案,以 Windows 98 為例,可以找到以下幾個螢幕保護程式:. 螢幕保護程式,入門式 (2). 螢幕保護程式,入門式 (3).
E N D
新觀念的 VB6 教本 第 16 章 螢幕保護程式
螢幕保護程式,入門式 (1) • 螢幕保護程式怎麼製作呢?首先讓我們來檢視 Windows 所提供的螢幕保護程式,請利用檔案總管搜尋Windows及Windows\System 目錄底下的 .scr檔案,以 Windows 98為例,可以找到以下幾個螢幕保護程式:
螢幕保護程式,入門式 (3) • 接著將任何一個 .scr 複製成為 test.exe 檔案,然後執行此一 test.exe 檔案,結果發現 test.exe 是可以執行的,這個試驗告訴我們 .scr 的螢幕保護程式其實就是一般的執行檔,只是它以 .scr 為副檔名,因此將來我們開發螢幕保護程式時,最後在編譯執行檔時(選取 VB 功能表的「檔案/製成XXX.exe」),也只要以 .scr為執行檔副檔名即可。
螢幕保護程式 第一版Step1-1 • 如下圖佈置控制元件,並設定好相關物件的屬性:
螢幕保護程式 第一版Step1-3 • 在以上的屬性中,比較值得的部分是表單的屬性,首先是將背景顏色(BackColor屬性)設定成黑色,接著還要將標題(Caption屬性)清成空白、邊框(BorderStyle 屬性)設定成 "0 - 沒有框線"、表單狀態(WindowsState 屬性)設定成 "2 - 最大化",將來執行時,才會出現「純黑佔滿螢幕」的表單。
螢幕保護程式 第一版Step 2 2. 在 Timer1_Timer 事件程序中撰寫以下程式: • 以上程式會促使 "歡迎使用大嘴巴的電腦!" 文字自右向左移動。 Private Sub Timer1_Timer() ' 左移文字寬度的 1/20Label1.Left = Label1.Left - Label1.Width / 20 If Label1.Left + Label1.Width < 0 Then ' 如果超過左邊界Label1.Left = Form1.ScaleWidth ' 移到右邊界End IfEnd Sub
螢幕保護程式 第一版Step 3 • 在 Form_Resize 事件程序中撰寫以下程式: • 以上程式的目的是當表單放到最大時,將 Label1 的位置設定於右邊界的中央位置。 Private Sub Form_Resize() ' 將文字的位置設定於表單右邊界的中央位置Label1.Left = Form1.ScaleWidth Label1.Top = (Form1.ScaleHeight - Label1.Height) / 2End Sub
螢幕保護程式 第一版Step 4 • 在 Form_KeyDown 事件程序中撰寫以下程式: • 當程式偵測到使用者按下鍵盤時,即呼叫 Unload Me 載出表單。 Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Unload Me ' 載出表單End Sub
螢幕保護程式 第一版Step 5 • 接著執行程式,測試看看,結果螢幕會被黑色背景的表單所佔滿,而 "歡迎使用大嘴巴的電腦!" 的文字會自左向右移動。測試之後,結束程式的方法是按下鍵盤的任意按鍵。 • 就一般螢幕保護程式的習慣來說,除了按鍵會終止螢幕保護程式之外,移動滑鼠也要能夠終止螢幕保護程式,因此接下來讓我們繼續加入滑鼠移動的偵測程式。
螢幕保護程式 第一版Step 6 • 在 Form_MouseMove 事件程序中撰寫以下程式: • 以上程式在偵測到滑鼠移動時,也一樣呼叫 Unload Me 載出表單結束程式。 Dim X0 As Single, Y0 As Single ' 用來記錄滑鼠的位置Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) ' 第一次發生滑鼠事件時,將位置記錄於 (X0,Y0) If X0 = 0 And Y0 = 0 Then X0 = X: Y0 = Y ' 如果滑鼠位置改變,就載出表單If X <> X0 Or Y <> Y0 Then Unload MeEnd Sub
製作成 saver01.scr (1) • 剛才我們所完成的螢幕保護程式只有 VB的工作環境底下進行測試,如何讓它真正地變成 Windows 的螢幕保護程式呢? • 首先要選取 VB 功能表的「檔案/製成XXX.exe」,而在接下來所出現的「製成執行檔」交談窗中,應將執行檔的副檔名由 .exe更改為 .scr,並且將路徑設定於Windows的所在目錄 。
製作成 saver01.scr (2) • 如下圖:
測試saver01.scr(1) • 完成程式的編譯之後,在 Windows 的桌面上按下滑鼠右鈕,待出現快顯功能表時,選取「內容」命令,接著選取「螢幕保護裝置」頁籤,然後拉下「螢幕保護裝置」,過程如下圖,結果可以在其中找到 saver01,這就是我們所製作出來的螢幕保護程式。
測試saver01.scr(3) • 選取 saver01之後,螢幕保護程式就會開始執行,這表示我們已經踏出了第一步。接著移動滑鼠結束 saver01 程式,再讓我們進行以下的測試:
測試saver01.scr -- 測試一 • 如上圖,設定「等待」時間,然後按下「套用」鈕,接下來靜候一分鐘,不要操作鍵盤與滑鼠,結果一分鐘之後 Windows 會啟動 saver01螢幕保護程式。
測試saver01.scr -- 測試二 • 如上圖,按下「預覽」鈕,結果 saver01螢幕保護程式也會被啟動,進入螢幕保護程式的預覽狀態。
測試saver01.scr -- 測試三(1) • 如上圖,按下「設定值」鈕,結果 saver01 螢幕保護程式也會被啟動,這一點好像不太對,因為標準的螢幕保護程式此時會出現設定的畫面。
測試saver01.scr -- 測試三(2) • 如果所選取的螢幕保護程式是 "Flying Windows",則按下「設定值」鈕時,會出現以下交談窗,輸入螢幕保護程式的設定值:
測試saver01.scr -- 測試四 • 如上圖,先核取「密碼保護」,然後按下「變更」鈕,結果 saver01 螢幕保護程式也會被啟動,而不像標準的螢幕保護程式一樣會出現密碼設定畫面。
螢幕保護程式 第二版 (1) • 經過以上的測試之後,我們知道 saver01應該改善的地方是當使用按下「設定值」及「密碼保護 -> 變更」時,不要執行螢幕保護程式。如何知道使用者是按下「設定值」及「密碼保護 -> 變更」呢?
螢幕保護程式 第二版 (2) • 其實當 Windows 啟動螢幕保護程式時,會在 .scr 執行檔之後附帶可以判別被啟動方式的參數,如下: • 如果參數的兩個字元等於 "/a" 或 "/A" • 如果參數的兩個字元等於 "/c" 或 "/C" • 如果參數的兩個字元等於 "/p" 或 "/P" • 其他
螢幕保護程式 第二版 (3) • 如果參數的兩個字元等於“/a”或“/A”:表示螢幕保護程式是因為使用者按下「密碼保護 -> 變更」而被啟動的。 • 如果參數的兩個字元等於 "/c" 或 "/C":表示螢幕保護程式是因為使用者按下「設定值」而被啟動的。 • 如果參數的兩個字元等於 "/p" 或 "/P":表示螢幕保護程式是因為第一次被選取而被啟動的。 • 其他:表示螢幕保護程式是因為使用者按下「預覽」或等待時間已到而被啟動的。
改良程式 -- Part I (1) • 因此為了改變螢幕保護程式第一版的缺點,筆者在 Form_Load 事件程序中(會在表單被載入時被執行)撰寫以下程式:
改良程式 -- Part I (2) Private Sub Form_Load() If UCase(Left(Command, 2)) = "/A" Then ' 密碼設定MsgBox "此一螢幕保護程式未提供「密碼保護」功能!"Unload Me End If If UCase(Left(Command, 2)) = "/C" Then ' 設定值MsgBox "此一螢幕保護程式沒有「設定值」!"Unload Me End If If UCase(Left(Command, 2)) = "/P" Then ' 小螢幕Unload Me End If…End Sub
改良程式 -- Part II Private Sub Form_Load() If UCase(Left(Command, 2)) = "/A" Then ' 密碼設定MsgBox "此一螢幕保護程式未提供「密碼保護」功能!"Unload Me End If If UCase(Left(Command, 2)) = "/C" Then ' 設定值MsgBox "此一螢幕保護程式沒有「設定值」!"Unload Me End If If UCase(Left(Command, 2)) = "/P" Then ' 小螢幕Unload Me End If If App.PrevInstance Then ' 已經在執行中Unload Me End IfEnd Sub • 在 Form_Load 件程序的最後面增加了以下敘述:
跳躍的直線 -- saver2a.vbp • 此一螢幕保護程式在表單上描繪一寬度等於 5 的直線,而每次直線描繪的位置及長度都是不固定的,因此感覺就像是「跳躍的直線」。
跳躍的直線 –Step 0~3 0. 以上一節的 saver02.vbp 專案為基礎。 • 佈置 Line 控制元件(工具箱的 ),並設定好以下屬性: • 刪除 Label1 控制元件。 • 刪除 Form_Resize 事件程序。
跳躍的直線 -- Step 4 4. 更改 Timer1_Timer 事件程序的內容: Private Sub Timer1_Timer() Line1.BorderColor = QBColor(Int(16 * Rnd)) Line1.X1 = Int(Form1.ScaleWidth * Rnd) Line1.Y1 = Int(Form1.ScaleHeight * Rnd) Line1.X2 = Int(Form1.ScaleWidth * Rnd) Line1.Y2 = Int(Form1.ScaleHeight * Rnd)End Sub
反彈球 -- saver2b.vbp • 此一螢幕保護程式會移動圓形圖示,而只要此一圖示撞到表單邊框時,即會反彈。
反彈球 -- Step 0~2 0.以上一節的 saver02.vbp 專案為基礎。 1.佈置 Image 控制元件,並且將其 Picture 屬性設定成本書 ch16目錄底下的 moon05.ico 圖示檔。 2.刪除 Label1 控制元件及 Form_Resize 事件程序。
反彈球 -- Step 3-1 • 更改 Timer1_Timer 事件程序的內容: Dim X0 As Single, Y0 As Single ' 這是既有的敘述Dim Motion As Integer ' 這是新增的敘述Private Sub Timer1_Timer() Dim offset As Integer If Motion = 0 Then Motion = 3 offset = Image1.Width \ 10
反彈球 -- Step 3-2 Select Case Motion Case 1 ' 向左上角移動Image1.Move Image1.Left - offset, Image1.Top - offset If Image1.Left <= 0 Then Motion = 2 ElseIf Image1.Top <= 0 Then Motion = 4 End If Case 2 ' 向右上角移動Image1.Move Image1.Left + offset, Image1.Top - offset If Image1.Left >= (Form1.ScaleWidth - Image1.Width) Then Motion = 1 ElseIf Image1.Top <= 0 Then Motion = 3 End If
反彈球 -- Step 3-3 Case 3 ' 向右下角移動Image1.Move Image1.Left + offset, Image1.Top + offset If Image1.Left >= (Form1.ScaleWidth - Image1.Width) Then Motion = 4 ElseIf Image1.Top >= (Form1.ScaleHeight - Image1.Height) Then Motion = 2 End If Case 4 ' 向左下角移動Image1.Move Image1.Left - offset, Image1.Top + offset If Image1.Left <= 0 Then Motion = 3 ElseIf Image1.Top >= (Form1.ScaleHeight - Image1.Height) Then Motion = 1 End If End SelectEnd Sub
月有陰晴圓缺 -- saver2c.vbp • 此一螢幕保護程式除了圖示撞到表單邊框會反彈之外,圖示也會產生月有陰晴圓缺的變化。
月有陰晴圓缺 -- Step 0~1-1 0. 以上一節的 saver02.vbp 專案為基礎。 1. 佈置 Image2 控制元件陣列,並設定好 Picture 屬性,此外 Image2 控制元件陣列每一個元素的 Visible 屬性都設定為 False 。
月有陰晴圓缺 -- Step 2-1 2. 修改 Timer1_Timer 事件程序的程式: Dim X0 As Single, Y0 As SingleDim Motion As IntegerDim Index As Integer ' 新增Private Sub Timer1_Timer() Set Image1.Picture = Image2(Index).Picture ' 新增 Dim offset As Integer If Motion = 0 Then Motion = 3 offset = Image1.Width \ 10 Select Case Motion
月有陰晴圓缺 -- Step 2~2 Case 1 ' 向左上角移動Image1.Move Image1.Left - offset, Image1.Top - offset If Image1.Left <= 0 Then Motion = 2 ElseIf Image1.Top <= 0 Then Motion = 4 End IfCase 2 ' 向右上角移動Image1.Move Image1.Left + offset, Image1.Top - offset If Image1.Left >= (Form1.ScaleWidth - Image1.Width) Then Motion = 1 ElseIf Image1.Top <= 0 Then Motion = 3 End If
月有陰晴圓缺 -- Step 2~3 Case 3 ' 向右下角移動Image1.Move Image1.Left + offset, Image1.Top + offset If Image1.Left >= (Form1.ScaleWidth - Image1.Width) Then Motion = 4 ElseIf Image1.Top >= (Form1.ScaleHeight - Image1.Height) Then Motion = 2 End If
月有陰晴圓缺 -- Step 2~4 Case 4 ' 向左下角移動Image1.Move Image1.Left - offset, Image1.Top + offset If Image1.Left <= 0 Then Motion = 3 ElseIf Image1.Top >= (Form1.ScaleHeight - Image1.Height) Then Motion = 1 End If End Select Index = Index + 1 ' 新增If Index = 8 Then Index = 0 ' 新增End Sub
砲火交織 -- saver2d.vbp • 此一螢幕保護程式會在表單上連續描繪寬度等於 5 的直線,每次的描繪總是接續上一直線,而直線的顏色及長度都是不固定的,因此感覺就像是「砲火交織」。
砲火交織 – Step 0~2 0.以上一節的 saver02.vbp 專案為基礎。 1.刪除 Label1 控制元件及 Form_Resize 事件程序。 2.更改 Timer1_Timer 事件程序的程式: Private Sub Timer1_Timer() Form1.DrawWidth = 5 X = Int(Form1.ScaleWidth * Rnd) Y = Int(Form1.ScaleHeight * Rnd) Line -(X, Y), RGB(Rnd * 255, Rnd * 255, Rnd * 255)End Sub
星火點點 – Step 0~2 0. 以上一節的 saver02.vbp 專案為基礎。 1. 刪除 Label1 控制元件及 Form_Resize 事件程序。 2. 更改 Timer1_Timer 事件程序的程式: Private Sub Timer1_Timer() Form1.DrawWidth = 5 X = Rnd * Form1.ScaleWidth Y = Rnd * Form1.ScaleHeight PSet (X, Y), RGB(Rnd * 255, Rnd * 255, Rnd * 255)End Sub
陣陣漣漪 – Step 0~2 0.以上一節的 saver02.vbp 專案為基礎。 1.刪除 Label1 控制元件及 Form_Resize 事件程序。 2.更改 Timer1_Timer 事件程序的程式: Private Sub Timer1_Timer() Form1.DrawStyle = 1 ' 破折線X = Form1.ScaleWidth / 2 Y = Form1.ScaleHeight / 2 R = Y * Rnd Circle (X, Y), R, RGB(Rnd * 255, Rnd * 255, Rnd * 255)End Sub