Introduction
A little time ago I was
looking for a Splash Screen
class which would allow me to display
a non rectangular bitmap
without mucancode.neting the background. Since I didn't find a
class that matched with my needs, I developed my own Splash
Screen class :- CSplashScreenEx
Compatibility
This class needs MFC
to be either statically or dynamically linked in your
project; it has been written, compiled and tested under
Visual Studio .NET (but should work well with VC++
6)
How to use the Class
The class is very easy
to use: Just add SplashScreenEx.h and SplashScreenEx.cpp
into your project, then include SplashScreenEx.h
into your application. To display
the splash screen
just include these lines in your OnInitDialog()
function:
CSplashScreenEx *pSplash=new CSplashScreenEx();
pSplash->Create(this,NULL,2000,CSS_FADE | CSS_CENTERSCREEN | CSS_SHADOW);
pSplash->SetBitmap(IDB_SPLASH,255,0,255);
pSplash->Show();
And that's it, the splash
screen appears for 2000 ms and then
disappears and frees the memory allocated.
Important note -
The class must be allocated on the heap since it is
automatically destroyed when it disappears.
CSplashScreenEx *pSplash=new CSplashScreenEx()
The splash
screen can also be used to display the
loading progression of your app, as seen in the Sample
number 2:
CSplashScreenEx *pSplash=new CSplashScreenEx();
pSplash->Create(this,"CSplashScreenEx dynamic text:",0,CSS_FADE |
CSS_CENTERSCREEN | CSS_SHADOW);
pSplash->SetBitmap(IDB_SPLASH,255,0,255);
pSplash->SetTextFont("Impact",100,CSS_TEXT_NORMAL);
pSplash->SetTextRect(CRect(125,60,291,104));
pSplash->SetTextColor(RGB(255,255,255));
pSplash->SetTextFormat(DT_SINGLELINE | DT_CENTER | DT_VCENTER);
pSplash->Show();
Sleep(1000);
pSplash->SetText("You can display infos");
Sleep(1000);
pSplash->SetText("While your app is loading");
Sleep(1000);
pSplash->SetText("Just call Hide() when loading");
Sleep(1000);
pSplash->SetText("is finished");
Sleep(1500);
pSplash->Hide();
Class Documentation
CSplashScreenEx::Create
BOOL Create(CWnd
*pWndParent,LPCTSTR szText=NULL,DWORD dwTimeout=2000,DWORD
dwStyle=CSS_FADE | CSS_CENTERSCREEN | CSS_SHADOW);
Create the Splash
Screen which stays hidden until Show()
is called
Arguments
pWndParent
:
The parent window (this
)
szText
:
The text displayed in your
splash screen
dwTimeout
:
The time in milliseconds before the
splash screen disappears. if 0 the splash
screen stays forever :)
dwStyle
:
Can be a combination of the following values:
CSS_FADEIN
: Fade In animation
while appearing
CSS_FADEOOUT
:
Fade Out animation while disappearing
CSS_FADE=CSS_FADEIN
| CSS_FADEOUT
: Fade in + Fade out
CSS_SHADOW
: Displays a shadow under the splash
screen
CSS_CENTERSCREEN
: The splash screen is
centered on the screen
CSS_CENTERAPP
:
The splash screen
is centered on the parent window
CSS_HIDEONCLICK
:
The splash screen
disappears and is destroyed when a key is
pressed or it is clicked with the mouse
CSplashScreenEx::SetBitmap
BOOL
SetBitmap(UINT nBitmapID,short
red=-1,short
green=-1,short
blue=-1);
BOOL
SetBitmap(LPCTSTR szFileName,short
red=-1,short
green=-1,short
blue=-1);
Associate the
splash screen with a bitmap
Arguments
nBitmapId
:
Resource ID for the bitmap
szFileName
:
Path for the bitmap
on the hard drive
red,green,blue
:
Transparency
color for the bitmap
(RGB color). Set these to -1 to disable bitmap
transparency
CSplashScreenEx::Show
void
Show();
Show the splash
screen
CSplashScreenEx::Hide
void
Hide();
Hide and destroy the
splash screen
CSplashScreenEx::SetText
void
SetText(LPCTSTR szText);
Change the text
displayed in the splash screen
CSplashScreenEx::SetTextFont
void
SetTextFont(LPCTSTR szFont,int
nSize,int nStyle);
Change the Font of the
text
Arguments
nStyle
can
be one or a combination of the following values:
CSS_TEXT_NORMAL
CSS_TEXT_BOLD
CSS_TEXT_ITALIC
CSS_TEXT_UNDERLINE
CSplashScreenEx::SetTextDefaultFont
void
SetTextDefaultFont();
Set the system default
font for the text displayed in the
splash screen
CSplashScreenEx::SetTextColor
void
SetTextColor(COLORREF crTextColor);
Change the text color
CSplashScreenEx::SetTextRect
void
SetTextRect(CRect& rcText);
Change the text rect
boundaries
CSplashScreenEx::SetTextFormat
void
SetTextFormat(UINT uTextFormat);
Change the text format;
see the DrawText
function in the MSDN for
the different values (default is DT_CENTER |
DT_VCENTER | DT_WORDBREAK
)
Technical issues
When SetBitmap()
is called, if a transparency
color has been specified, a GDI region is generated
(thanks to Davide Pizzolato code) and this region is
applied to the splash screen window
(SetWindowRgn
(...)). Thanks to this, the
window is not anymore rectangular. The rest of the code
is basic stuff, in the WM_PAINT
handler,
the background bitmap is blit on the window. Please
refer to the code for more details about the
implementation.
Conclusion
I hope this class will
be useful to you, if you find any memory or GDI leaks or
if you have suggestions to enhance this class, please
post a comment. If you use this class in a freeware,
shareware or commercial app, please let me know, I'll be
happy :)