Click here to Skip to main content
13,198,024 members (46,539 online)
Click here to Skip to main content
Add your own
alternative version


5 bookmarked
Posted 22 May 2011

Bubble Screen Saver

, 22 May 2011
Rate this:
Please Sign up or sign in to vote.
This project shows user how to create a screen saver Bubbles (Windows 7) in VB.NET.



Many users have questions about creating screensavers for their projects. And many users wish to create splash screens which are shaped the same as a transparent PNG, GIF, etc. This project is a Bubbles screensaver in Windows 7. Users can also use this code to make transparent forms.


Earlier I had tried to create a Super Bar like the Windows 7 Super Bar. And that's when I got the code to make a from transparent. And I decided to create this amazing screensaver using that code.

Using the code

First I will talk about creating a transparent from. I have used the PerPixelFrom library from Sbar on CodePlex to create a transparent from.

Imports System.Windows.Forms
Imports system.Runtime.InteropServices
Imports Screen_Saver.Win32
Public Class PerPixelAlphaForm
    Inherits Form
    Public StartLeft As Integer
    Public StartTop As Integer
    Public Ang As Double
    Public WithEvents tim As New Timer
    ' Methods
    Public Sub New()
        MyBase.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        MyBase.ShowInTaskbar = False

    End Sub

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    End Sub

    Public Sub SetBitmap(ByVal bitmap As Bitmap)
        Me.SetBitmap(bitmap, &HFF)
    End Sub

    Public Sub SetBitmap(ByVal bitmap As Bitmap, ByVal opacity As Byte)
        If (bitmap.PixelFormat <> Imaging.PixelFormat.Format32bppArgb) Then
            Throw New ApplicationException("The bitmap must be 32ppp with alpha-channel.")
        End If
        Dim screenDc As IntPtr = Win32.GetDC(IntPtr.Zero)
        Dim memDc As IntPtr = Win32.CreateCompatibleDC(screenDc)
        Dim hBitmap As IntPtr = IntPtr.Zero
        Dim oldBitmap As IntPtr = IntPtr.Zero
            hBitmap = bitmap.GetHbitmap(Color.FromArgb(0))
            oldBitmap = Win32.SelectObject(memDc, hBitmap)
            Dim size As New Size(bitmap.Width, bitmap.Height)
            Dim pointSource As New Point(0, 0)
            Dim topPos As New Point(MyBase.Left, MyBase.Top)
            Dim blend As New BLENDFUNCTION
            blend.BlendOp = 0
            blend.BlendFlags = 0
            blend.SourceConstantAlpha = opacity
            blend.AlphaFormat = 1
            Win32.UpdateLayeredWindow(MyBase.Handle, screenDc, (topPos), _
                  (size), memDc, (pointSource), 0, (blend), 2)
            Win32.ReleaseDC(IntPtr.Zero, screenDc)
            If (hBitmap <> IntPtr.Zero) Then
                Win32.SelectObject(memDc, oldBitmap)
            End If
        End Try
    End Sub
    ' Properties
    Protected Overrides ReadOnly Property CreateParams() As CreateParams
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = (cp.ExStyle Or &H80000)
            cp.ExStyle = (cp.ExStyle Or &H80)
            Return cp
        End Get
    End Property
End Class

For any form, we can use this code to make it transparent:

Dim frm As New PerPixelAlphaForm

This code makes frm (Form) transparent like the blue bubble image (as shown in the above image).

Now we will talk about how to show different colors of bubbles. I have used different images to show different colored bubbles.

First, I have defined a random number. Then according to it, we can set different images to bubbles. When Timer1 ticks, a random number is generated and a bubble comes out. I have combined them to close the screensaver when the cursor moves in timer1_tick code.

Private Sub Timer1_Tick(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Timer1.Tick
    If MposL <> System.Windows.Forms.Cursor.Position.X Or _
             MposT <> System.Windows.Forms.Cursor.Position.Y Then
        Timer1.Enabled = False
        Exit Sub
    End If
    k = New PerPixelAlphaForm
    Dim a As New System.Random
    Select Case a.NextDouble
        Case Is < 0.1
        Case Is < 0.2
        Case Is < 0.3
        Case Is < 0.4
        Case Is < 0.5
        Case Is < 0.6
        Case Is < 0.7
        Case Is < 0.8
        Case Else
    End Select
    If TotalBub < txtBubbles.Text Then
        k.Ang = 1.57 * a.NextDouble
        TotalBub += 1
    End If
    k = Nothing
End Sub

Now the difficulty was how to send bubbles in different directions and get them to move back when they collide with the edge of the screen. Again, I used a random number and some math functions to send them in different angles and when the position becomes beyond the screen width, they go in other directions. I have added a Timer to get the position and angle in PerPixelAlphaForm.vb.

Editing in PerPixelAlphaForm.vb

Private Sub Timer1_Tick(ByVal sender As System.Object, _
              ByVal e As System.EventArgs) Handles tim.Tick
    If Me.Left < 0 Or Me.Top < 0 Or Me.Left > _
               Screen.PrimaryScreen.WorkingArea.Width - _
               185 Or Me.Top > Screen.PrimaryScreen.WorkingArea.Height - 185 Then
        Ang += 1.57 * Date.Now.Millisecond / 1000
        If Me.Left < 0 Then Me.Left = 0
        If Me.Top < 0 Then Me.Top = 0
        If Me.Right > Screen.PrimaryScreen.WorkingArea.Width Then Me.Left = _
               Screen.PrimaryScreen.WorkingArea.Width - 185
        If Me.Bottom > Screen.PrimaryScreen.WorkingArea.Height Then Me.Top = _
               Screen.PrimaryScreen.WorkingArea.Height - 185
        Me.Left += Math.Cos(Ang) * 10
        Me.Top -= Math.Sin(Ang) * 10
    End If
End Sub

I have set timer1.interval to 2 to give speed and reality to bubbles when they load.

Private Sub PerPixelAlphaForm_Load(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles MyBase.Load
    tim.Enabled = True
    tim.Interval = 2
    Me.Top = Screen.PrimaryScreen.WorkingArea.Height - 200
    Me.Left = 0
End Sub


First Release - May 22, 2011.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Tarun Mangukiya
Student LifeTYM
India India
Hi! I am Tarun Mangukiya from Gujarat, India.
I like to make software and websites based on VB.NET, ASP.NET, php, Windows, Windows Phone, etc.
I believe in making user-friendly apps.
And I want to improve myself for the new upcoming world of Technology...

No need to be the best, just be good and everything around will be the best automatically.

My Apps :
Shabdkosh - The Gujarati Dictionary (
Ahmedabad Tourism (

You may also be interested in...

Comments and Discussions

Questiongood for sample in school Pin
maxoptimus24-May-16 4:11
membermaxoptimus24-May-16 4:11 
QuestionHandle error when transfer to C# Pin
Emrah Kondur4-Aug-15 21:05
memberEmrah Kondur4-Aug-15 21:05 
Questionthank you Pin
lijingkai30-May-14 2:31
memberlijingkai30-May-14 2:31 
GeneralMy vote of 5 Pin
LaxmikantYadav6-May-14 1:49
memberLaxmikantYadav6-May-14 1:49 
QuestionSetup screen for showing bubbles on multiple screens Pin
CiprianLUPU5-Sep-13 0:18
memberCiprianLUPU5-Sep-13 0:18 
QuestionMy vote of 1. Pin
sdffsdfdsfsdfdg2-Aug-13 16:12
membersdffsdfdsfsdfdg2-Aug-13 16:12 
Questioncm Pin
Member 1006633020-May-13 18:29
memberMember 1006633020-May-13 18:29 
QuestionMy.resources Pin
Jean-Daniel Yannick Chloé29-Apr-13 8:06
memberJean-Daniel Yannick Chloé29-Apr-13 8:06 
QuestionScreen saver Pin
Jean-Daniel Yannick Chloé29-Apr-13 7:12
memberJean-Daniel Yannick Chloé29-Apr-13 7:12 
I'm trying to do it but each time it is saying that the "Screen_Saver.Win32 is not accessible in this context because it is Friend"
and i can't acess the blendfunction, can you helpl please
QuestionAdding more stuff Pin
Member 841625919-Nov-11 7:23
memberMember 841625919-Nov-11 7:23 
GeneralMy vote of 1 Pin
Richard MacCutchan30-May-11 4:58
mvpRichard MacCutchan30-May-11 4:58 
General[My vote of 1] Code dump Pin
Mark Nischalke22-May-11 2:36
mvpMark Nischalke22-May-11 2:36 
GeneralRe: [My vote of 1] Code dump Pin
Tarun Mangukiya22-May-11 21:18
memberTarun Mangukiya22-May-11 21:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.171020.1 | Last Updated 22 May 2011
Article Copyright 2011 by Tarun Mangukiya
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid