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
- Transparency
- Bitmap files for the splash image
- Simple non-MFC, C++ interface
- Uses only Win32 calls
Limitations
- Works only on WinXP/Win2000 and later
- Image formats other than bmp is not supported
- 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"
CSplash splash1(TEXT(".\\Splash.bmp"), RGB(128, 128, 128));
splash1.ShowSplash();
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