平码公式规律出肖|平码可以买3个平码吗

VBGood網站全文搜索 Google

搜索VBGood全站網頁(全文搜索)
首頁 - 經驗之談 - 設 計 屏 幕 保 護 程序
發表評論(0)作者:, 平臺:, 閱讀:13742, 日期:2000-03-12


  利 用VB5.0 設 計 屏 幕 保 護 程序--李 波 濤

 


 

實際上使用Visual Basic 5.0很容易建立屏幕保護程序。任何Visual Basic 應用程

序都可以作為一個屏幕保護程序來運行,只是有的

程序做此工作會比其它程序更好一些。要想使自己的應用程序扮演Windows環境中屏幕保護

程序的角色,需要將該程序作為一個屏幕保護程

序來編譯。

 

具體操作:從File菜單上選定Make EXE File,在Make EXE File對話框中作以下改

動:不再建立帶擴展名為EXE的可執行文件,而是把

擴展名改為SCR。

 

下面具體探討了如何利用Visual Basic 5.0設計屏幕保護程序,也就是在設計屏幕保

護程序時應注意的幾個問題:

 

1、 如何防止同時運行屏幕保護程序的兩個實例

Visual Basic 提供了一個App 對象,它有一個PreInstance 屬性,如果當前Visual Basic

應用程序的一個實例已經運行時,便把該屬

性設置為True,從而避免同時運行一個屏幕保護程序的多個實例。

下面的代碼展示App.PreInstance 是如何典型地在一個屏幕保護程序中實現的。

 

If App.PreInstance=True then

Unload Me

Exit Sub

End If

此外,還有一種更好的方法可以避免同時運行一個屏幕保護程序的多個實例。使用一個

通知操作系統已經有一個屏幕保護程序被激活的

Windows 95 API函數。這個函數便是SystemParametersInfo,其聲明如下:

 

Private Declare Function SystemParametersInfo Lib "user32" _

Alias "SystemParametersInfoA" ( _

ByVal uAction As Long, _

ByVal uParam As Long, _

ByVal lpvParam As Any, _

ByVal fuWinIni As Long _

) As Long

在窗體加載事件的開始調用一次這個函數并在窗體卸載事件期間再調用一次。這兩個調

用必須成對出現并且二者必須在屏幕保護程序的

執行期間進行調用。

 



 

以下是在窗體加載事件中對該函數的調用:

 

x=SystemParametersInfo(17,0,ByVal 0&,0)

 

以下是在窗體卸載事件中對該函數的調用:

 

x=SystemParametersInfo(17,1,ByVal 0&,0)

 

2、如何在屏幕保護程序中隱藏鼠標光標

ShowCursor API 函數允許在Visual Basic 應用程序中隱藏或顯示鼠標光標,Windows 通

過更改它所維護的一個變量中的計數跟蹤鼠標

光標的可視性, 每次用參數值True調用ShowCursor 都使這個計數遞增,每次用參數值False

調用ShowCursor都使這個計數遞減,如果該計

數為0 或者更小, 鼠標光標自動隱藏起來。 以下是ShowCursor API函數的聲明:

Private Declare Function ShowCursor Lib "user32" ( _

ByVal bShow As Long _

) As Long

下面是兩個使用ShowCursor 函數的例子。

顯示鼠標光標:

Private Sub ShowMouse()

While ShowCursor(True)<=0

Wend

End Sub

隱藏鼠標光標:

Private Sub HideMouse()

While ShowCursor(False)>0

Wend

End Sub

 

3、如何檢測鼠標的移動

MouseMove事件用來檢測鼠標的移動,當應用程序啟動時甚至鼠標實際上并未移動的情

況下,MouseMove 事件都會觸發一次。所以第一次

觸發MouseMove事件時,只是記錄鼠標當前位置,僅當鼠標真正從其起始位置移開時,才終

止屏幕保護程序。具體實現代碼如下:

Private Sub Form_MouseMove(Button As Integer, _

Shift As Integer, X As Single, Y As Single)

Static XLast, YLast As Single

Dim XNow, YNow As Single

 

'記錄當前位置

XNow = X

YNow = Y

 

'第一次觸發MouseMove 事件, 記錄當前位置

If XLast = 0 And YLast = 0 Then

XLast = XNow

YLast = YNow

Exit Sub

End If

 

'僅當鼠標移動足夠迅速( 一次2個像素以上)才恢復屏幕

If Abs(XNow - XLast) > 2 Or Abs(YNow - YLast) > 2 Then

QuitFlag = True

End If

End Sub

 

4、如何檢測鼠標單擊

Form_Click事件用來檢測鼠標單擊,Form_Click事件的具體代碼如下:

Private Sub Form_Click()

' 鼠 標 單 擊, 結 束 屏 幕 保 護 程 序

QuitFlag=True

End Sub

5、 如何檢測鍵盤的活動

Form_KeyDown 事件用來檢測鍵盤的活動,當按下任何一個鍵( 包 括 換 檔 鍵)時,

都能結束屏幕保護程序。Form_KeyDown 事件的具

體代碼如下:

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

' 按 下 鍵 盤, 結 束 屏 幕 保 護 程 序

QuitFlag = True

End Sub

6、 設置幾個重要屬性

Form 窗體BorderStyle 為0-None,ControlBox 為False,KeyPreview 為True,MaxButton

和MinButton 為False,WindowState 為

2-Maximized, 定義窗體級變量QuitFlag(Dim QuitFlag as Boolean)。

Timer控件( 在Form 窗 體 中)Enabled 屬性在設計環境中設置為False。

 

下面有一個完整的屏幕保護程序實例,其演示效果為:把當前的顯示復制到一個全屏幕

的窗體中,然后隨機在屏幕上畫一些實心彩色小圓,

并隨機顯示彩色字樣"Baby,I loveyou!"。 同時, 在屏幕底部有一移動的圖片框,可以在設

計環境中添加自己喜歡的圖片,例如可設計為:程

序設計:李波濤。在本屏幕保護程序中,設置Timer 控件的Name屬性為tmrExitNotify; 另

外,在窗體底部添加一個PictureBox控件,設置其

Name屬性為picture1。

 

在調試本程序時,有一技巧值得說明的是:可將Form_Load 事件中Select Case …End

Select語句稍作修改如下:

 

a、 將Case "/S" 注 釋 掉, 在 其 下 添 加Case Else 語 句;

b、 將Case Else/Unload Me/Exit Sub 三 條 語 句 注 釋 掉;

 

這樣,可在VB5.0 環境下,調試本程序,預覽演示效果。在調試完成后,再將上述修

改恢復原樣,編譯成后綴為SCR的文件。

 

Option Explicit

 

'Declare API to inform system whether screen saver is active

Private Declare Function SystemParametersInfo Lib "user32" _

Alias "SystemParametersInfoA" ( _

ByVal uAction As Long, _

ByVal uParam As Long, _

ByVal lpvParam As Any, _

ByVal fuWinIni As Long _

) As Long

 

'Declare API to hide or show mouse pointer

Private Declare Function ShowCursor Lib "user32" ( _

ByVal bShow As Long _

) As Long

 

'Declare API to get a copy of entire screen

Private Declare Function BitBlt Lib "gdi32" ( _

ByVal hDestDC As Long, _

ByVal X As Long, _

ByVal Y As Long, _

ByVal nWidth As Long, _

ByVal nHeight As Long, _

ByVal hSrcDc As Long, _

ByVal xSrc As Long, _

ByVal ySrc As Long, _

ByVal dwRop As Long _

) As Long

 

'Declare API to get handle to screen

Private Declare Function GetDesktopWindow Lib "user32" () As Long

'Declare API to convert handle to device context

Private Declare Function GetDC Lib "user32" ( _

ByVal hwnd As Long _

) As Long

 

'Declare API to release device context

Private Declare Function ReleaseDC Lib "user32" ( _

ByVal hwnd As Long, _

ByVal hdc As Long _

) As Long

 

'Define constants

Const SPI_SETSCREENSAVEACTIVE = 17

 

'Define form-level variables

Dim QuitFlag As Boolean

 

Private Sub Form_Click()

'Quit if mouse is clicked

QuitFlag = True

End Sub

 

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)

'Quit if keyboard is clicked

QuitFlag = True

End Sub

 

Private Sub Form_Load()

Dim X As Long, Y As Long

Dim XScr As Long, YScr As Long

Dim dwRop As Long, hwndSrc As Long, hSrcDc As Long

Dim Res As Long

Dim Count As Integer

 

'Tell system that application is active now

X = SystemParametersInfo( _

SPI_SETSCREENSAVEACTIVE, 0, ByVal 0&, 0)

'Hide mouse pointer

X = ShowCursor(False)

 

'Proceed based on command line

Select Case UCase(Left(Command, 2))

 

'Put the show on the load

Case "/S"

Randomize

'Copy entire desktop screen into picture box

Move 0, 0, Screen.Width + 1, Screen.Height + 1

 

dwRop = &HCC0020

hwndSrc = GetDesktopWindow()

hSrcDc = GetDC(hwndSrc)

Res = BitBlt(hdc, 0, 0, ScaleWidth, _

ScaleHeight, hSrcDc, 0, 0, dwRop)

Res = ReleaseDC(hwndSrc, hSrcDc)

 

'Display full size

Show

 

Form1.AutoRedraw = False

'Graphics loop

Do

Count = 0

X = Form1.ScaleWidth * Rnd

Y = Form1.ScaleHeight * Rnd

 

Do

X = Form1.ScaleWidth * Rnd

Y = Form1.ScaleHeight * Rnd

 

DoEvents

 

Form1.FillColor = QBColor(Int(Rnd * 15) + 1)

Circle (X, Y), Rnd * 80, Form1.FillColor

Count = Count + 1

 

'Exit this loop only to quit screen saver

If QuitFlag = True Then Exit Do

 

'Move picture

Dim Right As Boolean

If Picture1.Left > 10 And Not Right Then

Picture1.Left = Picture1.Left - 10

Else

Right = True

If Picture1.Left < 7320 Then

Picture1.Left = Picture1.Left + 10

Else

Right = False

End If

End If

If (Count Mod 100) = 0 Then

Form1.ForeColor = QBColor(Int(Rnd * 15) + 1)

Print "Baby, I love you!"

End If

 

Loop Until Count > 500

Form1.Cls

 

Loop Until QuitFlag = True

 

tmrExitNotify.Enabled = True

Case Else

Unload Me

Exit Sub

End Select

End Sub

 

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As

Single, Y As Single)

Static XLast, YLast As Single

Dim XNow, YNow As Single

 

'Get current position

XNow = X

YNow = Y

 

'On first move, simply record position

If XLast = 0 And YLast = 0 Then

XLast = XNow

YLast = YNow

Exit Sub

End If

 

'Quit only if mouse actually changes position

If Abs(XNow - XLast) > 2 Or Abs(YNow - YLast) > 2 Then

QuitFlag = True

End If

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

Dim X

 

'Inform system that screen saver is now inactive

X = SystemParametersInfo( _

SPI_SETSCREENSAVEACTIVE, 1, ByVal 0&, 0)

 

'Show mouse pointer

X = ShowCursor(True)

End Sub

 

Private Sub tmrExitNotify_Timer()

'Time to quit

Unload Me

End Sub

平码公式规律出肖 安全互联网理财平台 云南麻将 沪市大盘600001 上证指数年线是多少 广西11选5开奖结 云南11选5开奖结 3d今日开机号 英超足球直播 上证股票指数是什么意思 伊利股份股票分析报告