Click here to Skip to main content
Click here to Skip to main content

CSplash - A Splash Window Class

By , 6 Jul 2004
 

Introduction

A very common requirement for applications that take a lot of time to start, is to throw up a nice looking splash window at startup. Here I will discuss how such splash windows can be developed using the new layering APIs available with Win2000 and later versions of Windows.

The splash screen supports the following features

  1. Transparency
  2. Bitmap files for the splash image
  3. Simple non-MFC, C++ interface
  4. Uses only Win32 calls

Limitations

  1. Works only on WinXP/Win2000 and later
  2. Image formats other than bmp is not supported
  3. Text messages or progress bar to display initialization progress is not present though it can be added if required

This application also shows how visually rich modules can be developed using C++ and Win32 without MFC.

Preparing the Image

First create the image you would like to show as the splash in your favorite image editor. Then choose the part of the image you would not like to be rendered on the screen and give it a particular color that does not occur anywhere else on the image. For an example if your image is a red circle with some logo or text inside it in blue then fill all the region outside the circle with a color like green (anything other than red and blue, I used grey 128,128,128). Note the R, G, B values of the color.

Using CSplash

The interface of the class is very simple. Use the overloaded constructor and specify the bitmap file path and the color on it to be made transparent. Then use the method ShowSplash to show the splash screen. The function returns immediately. You can then complete all your initialization and at the end, call CloseSplash to remove the splash window. Following is the code

#include "splash.h"

// Include the class header in your file
// Give the path of the image and the transparent color
CSplash splash1(TEXT(".\\Splash.bmp"), RGB(128, 128, 128));

//  Display the splash
splash1.ShowSplash();

// your start up initialization code goes here

// Close the splash screen
splash1.CloseSplash();

The other alternative is to use the default constructor and then use individual calls to set up the bitmap path and transparent color. In the sample project the source file SplashClient.cpp contains code that demonstrates both ways of using the CSplash class.

Under the hood

The class is implemented using Win32 API calls.

The constructor stores the pointer to the layering Win32 call SetLayeredWindowAttributes that is used to make the window transparent from USER32.dll into a function pointer g_pSetLayeredWindowAttributes.

The SetBitmap method opens the bitmap file, loads it and stores a handle to it in the m_hBitmap member. It also stores its width and height in m_dwWidth and m_dwHeight.

SetTransparentColor calls MakeTransparent which sets the layering style of the window and uses the function pointer g_pSetLayeredWindowAttributes to make the requested color transparent for the CSplash window.

The private function RegAndCreateWindow registers and creates the window for the splash window. The window procedure used with this window is an external function ExtWndProc. With the CreateWindowEx call we pass the this pointer. This makes the pointer to CSplash class reach the ExtWndProc function as lparam with the WM_CREATE message. ExtWndProc stores this pointer and forwards all subsequent messages to the member function CSplash::WindowProc

CSplash::WindowProc contains code to call OnPaint on receiving WM_PAINT message. Inside OnPaint we select the bitmap (in m_hBitmap) to a device context in memory and then BitBlt it to the screen device context. And we are done displaying the splash window.

To close the window CloseSplash destroys the window and unregisters the class associated with the window.

History

  • Date Posted: July 02, 2004

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

abhinaba
Web Developer
United States United States
Member
I just love coding. I started programming in 1995 with BASIC and then moved through Cobol, Pascal, Prolog, C, C++, VB, VC++ and now C#/.NET.
 
I received a Bachelor of Technology degree in Computer Science from University of Calcutta in 2001.
 
I worked for some time in Texas Instruments, Adobe Systems and now in Microsoft India Development Center in the Visual Studio Team Systems.
 
I am from the City of Joy, Kolkata in India, but now live and code Hyderabad.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralRe: some questions.memberabhinaba7 Oct '05 - 20:43 
A easy way of getting this done is have a label on the splash screen. In that show progress strings. In the lines of
Loading images...
Loading font...
 
In case you want to show progress bar you can try http://www.codersource.net/mfc_cprogressctrl.html
 

 
==========================
AB => Code and let code
Go to my home
==========================
GeneralRe: some questions.memberbabyspidy8 Oct '05 - 7:44 
Thanks.
I'll try your suggestion and also check the link you gave.
 
Thanks a lot. much appreciated.Smile | :)
 
With great power comes a great responsibility.
GeneralOutput of Textmemberx-robi9 May '05 - 10:45 
Hi,
how is it possible to draw some start up information
in the splash screen. D'Oh! | :doh:
Generalwho can solve this problem...sussAnonymous11 Aug '04 - 3:56 

why SetLayeredWindowAttributes can't used in 8 bits(256) color quality.


who can solve this problem...
 
please tell me, thanks.





QuestionConstruct from bitmap resource?memberRavi Bhavnani7 Jul '04 - 9:43 
Thanks for sharing! Would you consider adding an API to use a bitmap resource (specified by its id)?
  DWORD SetBitmap (UINT uIdBitmap);
/ravi
 
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com

AnswerRe: Construct from bitmap resource?memberabhinaba7 Jul '04 - 19:29 
For comleteness I should have added such a method. The code would be as follows
 
DWORD CSplash::SetBitmap(UINT uBitmap)
{
    HBITMAP    hBitmap       = NULL;
    HINSTANCE  hInstResource = NULL;
    
    // Find correct resource handle
    hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(uBitmap), RT_BITMAP);
    
    // Load bitmap In
    hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(uBitmap),
                                   IMAGE_BITMAP, 0, 0, 0);
    
    return SetBitmap(hBitmap);
}

 
==========================
AB => Code and let code
Go to my home
==========================
GeneralRe: Construct from bitmap resource? [modified]memberSoliant15 Jun '06 - 2:43 
abhinaba wrote:
AfxFindResourceHandle(MAKEINTRESOURCE(uBitmap), RT_BITMAP);

 
Yeah, but do you really want to use an MFC call, when the whole project was just straight winapi/c++ ?
 
An alternative for this call (non-MFC) would be nice, maybe this would work
 

DWORD CSplash::SetBitmap(UINT uBitmap)
{
HBITMAP hBitmap = NULL;
HMODULE hInstResource = NULL;

// Find correct resource handle
hInstResource = ::GetModuleHandle(NULL); //replace MFC dep. code

// Load bitmap In
hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(uBitmap),
IMAGE_BITMAP, 0, 0, 0);

return SetBitmap(hBitmap);
}

 

Thanks for your efforts and the article! Smile | :)
 

R.Bischoff

Tengas un buen dia

 

-- modified at 9:47 Thursday 15th June, 2006

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130523.1 | Last Updated 7 Jul 2004
Article Copyright 2004 by abhinaba
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid