Creating a Screen Saver

By | 2002-06-01

Create a screen saver in VB!

Original Author: VB Tips and Source Code

Code

In order to accomplish this task, start a new Visual Basic project. This example only requires a form - no VBXs or additional modules necessary. On the form, set the following properties:

ÔÇóCaption = "" ÔÇóControlBox = False ÔÇóMinButton = False ÔÇóMaxButton = False ÔÇóBorderStyle = 0 ' None ÔÇóWindowState = 2 ' Maximized ÔÇóBackColor = Black

The next order of business is to place a line (shape control) on the form. Draw it to any orientation and color you wish. Set the color by using the BorderColor property.
The last control that you will need to place on the form is a timer control. Set the timer's interval property anywhere from 100 to 500 (1/10 to 1/2 of a second).
In the general declarations section of the form you will need to declare two API functions. The first of these (SetWindowPos) is used to enable the form to stay on top of all other windows. The second (ShowCursor) is used to hide the mouse pointer while the screen saver runs and to restore it when the screen saver ends. The declares look like the following:

For VB3:
   Declare Function SetWindowPos Lib "user" (ByVal h%, ByVal hb%, ByVal x%, ByVal Y%, ByVal cx%, ByVal cy%, ByVal f%) As Integer
   Declare Function ShowCursor Lib "User" (ByVal bShow As Integer) As Integer
For VB4:
   Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
   Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

The first SUB we will write will be the routine that we will call to keep the form always on top. Place this SUB into the general declarations section of the form.

Sub AlwaysOnTop (FrmID As Form, OnTop As Integer)
  ' This function uses an argument to determine whether
  ' to make the specified form always on top or not
  Const SWP_NOMOVE = 2
  Const SWP_NOSIZE = 1
  Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
  Const HWND_TOPMOST = -1
  Const HWND_NOTOPMOST = -2
  If OnTop Then
    OnTop = SetWindowPos(FrmID.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
  Else
    OnTop = SetWindowPos(FrmID.hWnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
  End If
End Sub

The next issue we will take up will be the issue of getting the program started. This is of course the Form_Load event procedure. The actions we will take in this procedure is to randomize the number generator (so that the line moves around differently each time the screen saver is activated). We will also call the AlwaysOnTop SUB so that it will appear over everything else on the screen.

Sub Form_Load ()
  Dim x As Integer   ' Declare variable
  Randomize Timer    ' Variety is the spice of life
  AlwaysOnTop Me, True ' Cover everything else on screen
  x = ShowCursor(False) ' Hide MousePointer while running
End Sub

Now, before we handle the logic of making the line bounce around the screen, let's go ahead and handle shutting the program down. Most screen savers terminate when one of two things happen. Our's will end when the mouse is moved or when a key is pressed on the keyboard. Therefore we will need to trap two event procedures. Since there are no controls on the screen that can generate event procedures, we need to trap them at the form level. We will use the Form_KeyPress and Form_MouseMove event procedures to handle this. They appear as follows:

Sub Form_KeyPress (KeyAscii As Integer)
  Dim x As Integer
  x = ShowCursor(True) ' Restore Mousepointer
  Unload Me
  End
End Sub
Sub Form_MouseMove (Button As Integer, Shift As Integer, x As Single, Y As Single)
  Static Count As Integer
  Count = Count + 1 ' Give enough time for program to run
  If Count > 5 Then
    x = ShowCursor(True) ' Restore Mousepointer
    Unload Me
    End
  End If
End Sub

Finally, we need to handle the logic necessary to cause motion on the screen. I have created two sets of variables. One set DirXX handles the direction (1=Right or Down and 2=Left or Up) of the motion for each of the line control's four coordinates. The other set SpeedXX handles the speed factor for each of the line's four coordinates. These will be generated randomly (hence the Randomize Timer statement in Form_Load). These variables are Static, which of course means that each time the event procedure is called, they will retain their values from the preceeding time. The first time through the procedure they will also be set to zero. Therefore the program will assign these random values the first time through. From that point on, the program checks the direction of movement of each of the four coordinates and relocates them to a new position (the distance governed by the SpeedXX variable). The last section of code simply checks these coordinates to see if they left the visible area of the form and if they did their direction is reversed. This of course goes in the Timer's event procedure.

Sub Timer1_Timer ()
  Static DirX1 As Integer, Speedx1 As Integer
  Static DirX2 As Integer, Speedx2 As Integer
  Static DirY1 As Integer, Speedy1 As Integer
  Static DirY2 As Integer, Speedy2 As Integer
  ' Set initial Direction
  If DirX1 = 0 Then DirX1 = Rnd * 3
  If DirX2 = 0 Then DirX2 = Rnd * 3
  If DirY1 = 0 Then DirY1 = Rnd * 3
  If DirY2 = 0 Then DirY2 = Rnd * 3
  ' Set Speed
  If Speedx1 = 0 Then Speedx1 = 60 * Int(Rnd * 5)
  If Speedx2 = 0 Then Speedx2 = 60 * Int((Rnd * 5))
  If Speedy1 = 0 Then Speedy1 = 60 * Int((Rnd * 5))
  If Speedy2 = 0 Then Speedy2 = 60 * Int((Rnd * 5))
  ' Handle Movement
  ' If X1=1 then moving right else moving left
  ' If X2=1 then moving right else moving left
  ' If Y1=1 then moving down else moving up
  ' If Y2=1 then moving down else moving up
  If DirX1 = 1 Then
    Line1.X1 = Line1.X1 + Speedx1
  Else
    Line1.X1 = Line1.X1 - Speedx1
  End If
  If DirX2 = 1 Then
    Line1.X2 = Line1.X2 + Speedx2
  Else
    Line1.X2 = Line1.X2 - Speedx1
  End If
  If DirY1 = 1 Then
    Line1.Y1 = Line1.Y1 + Speedy1
  Else
    Line1.Y1 = Line1.Y1 - Speedy1
  End If
  If DirY2 = 1 Then
    Line1.Y2 = Line1.Y2 + Speedy2
  Else
    Line1.Y2 = Line1.Y2 - Speedy2
  End If
  ' Handle bouncing (change directions if off screen)
  If Line1.X1 < 0 Then DirX1 = 1
  If Line1.X1 > Me.ScaleWidth Then DirX1 = 2
  If Line1.X2 < 0 Then DirX2 = 1
  If Line1.X2 > Me.ScaleWidth Then DirX2 = 2
  If Line1.Y1 < 0 Then DirY1 = 1
  If Line1.Y1 > Me.ScaleHeight Then DirY1 = 2
  If Line1.Y2 < 0 Then DirY2 = 1
  If Line1.Y2 > Me.ScaleHeight Then DirY2 = 2
End Sub

Once you have entered all the preceeding code you have a nice little program that looks like a screen saver. You can compile it into an EXE and run it anytime you like. However, to make it into a true Windows screen-saver you need to do the following steps:

1.Choose "Make EXE File" from the File menu. 2.In the "Application Title" text box, type in the following: SCRNSAVE:VB4UandME Example 3.Change the extension in the EXE filename to have an SCR extension instead of an EXE. 4.Change the destination directory to your Windows directory (where all screen savers need to reside) 5.Click OK and let the compilation proceed.
At this point, you should be able to bring up the Windows Control Panel and select VB4UandME Example as the new screen saver. For Windows 3.1 this is found in the Desktop icon within Control Panel. For Windows 95, it is found in the Display icon in Control Panel (second tab).

Author: dwirch

Derek Wirch is a seasoned IT professional with an impressive career dating back to 1986. He brings a wealth of knowledge and hands-on experience that is invaluable to those embarking on their journey in the tech industry.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.