Click here to Skip to main content
15,892,746 members
Articles / Desktop Programming / Win32

Splash Screen C++ Class without MFC or .NET

Rate me:
Please Sign up or sign in to vote.
4.71/5 (14 votes)
21 Apr 2009CPOL3 min read 64.7K   5.2K   52   10
A C++ class to generate a splash screen and about box from a bitmap and version string resources.

Introduction

Every application needs an “about box” and some need a “splash screen” while loading. Most developers use the boring “about dialog” that is created automatically. I created the class, CSplashScreen, to handle both, to make them less error prone and to make them more interesting. I use this class for programs from tiny dialog applets to complex applications that take a couple of minutes to load and initialize.

The class consists of two files, SplashScreen.h and SplashScreen.cpp. The class does not require MFC or .NET. I have another class that uses MFC.

The class gets all the information to display the splash screen from a bitmap and the version strings in the resources. Therefore, you don’t have to modify the splash screen every time the version changes.

The splash screen disappears when clicked on, a key is pressed, or the desired time has elapsed.

Splash Screen Example

Image 1

Using the code

  • Include SplashScreen.h and SplashScreen.cpp.
  • Add version strings to the resources.
  • Add the IDB_SPLASH bitmap to the resources.
  • Add version.lib to the link libraries.

ShowSplashScreen(HWND pParentWnd, LPCTSTR statusMessage, int millisecondsToDisplay) can have zero to three parameters.

  • pParentWnd - parent window of splash screen
  • statusMessage - string to display in status area of splash screen
  • millisecondsToDisplay - number of milliseconds before hiding splash screen

To show the splash screen during initialization, add CSplashScreen::ShowSplashScreen();.

C++
#include "SplashScreen.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    MSG msg;
    
    // display splash screen and have it turn off after 10 seconds
    CSplashScreen::ShowSplashScreen( hWnd, "http://applehome.com/", 10000);
  .
  .
  .
    while (GetMessage(&msg, NULL, 0, 0))  {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return msg.wParam;
}

To show the about box, add CSplashScreen::ShowSplashScreen() to WndProc(…):

C++
#include "SplashScreen.h"

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) {
    case WM_COMMAND:
        // Parse the menu selections:
        switch (LOWORD(wParam)) {
        case IDM_ABOUT:
            // display about box
            CSplashScreen::ShowSplashScreen( hWnd );
            break;
        }
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

Under the hood

Since I’m a consultant, I create a specialized bitmap for each client. I typically place the company logo and the application icon in the IDB_SPLASH bitmap. Depending on your artistic talent, you can make a very professional splash screen. The version strings are written on top of the bitmap.

There are 3 groupings of strings: Product Name, Body, and Status. The Body consists of one or more of the company name, version, copyright, and comment strings. I prefer the product name to be larger, with the multiple lines of the body smaller. I use Status only when the application is loading.

Each group has static variables that specify how the strings in that group are drawn:

  • m_xxxVerticalOffset - empty space between the top of the bitmap and the first string
  • m_xxxVerticalHeight - the maximum height of a group of strings
  • m_xxxLeftMargin - the distance from the left side to the place strings
  • m_xxxRightMargin - the distance from the right side to strings
  • m_xxxFontName - the name of the font for strings
  • m_xxxPointSize - the point size used for strings, (-1,-1) ==> Calculate point size
  • m_xxxTextColor - the color used for strings

The body can have from 0 to 4 strings. Set the static display variables:

  • m_displayCompanyName - true if displaying company name
  • m_displayVersion - true if displaying version
  • m_displayCopyright - true if displaying copyright
  • m_displayComments - true if displaying comments

The CSplashScreen class is instantiated when CSplashScreen::ShowSplashScreen() is called. It is deleted when the timeout elapses, a key is pressed, or the the mouse is clicked.

History

  • Date posted: April 21, 2009

License

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


Written By
Software Developer (Senior) Apple Enterprises - http://applehome.com/
United States United States
I have been a software consultant at Apple Enterprises, http://applehome.com/, since 1981, a paid programmer since 1975 and a programmer since 1969 when I took my first programming class at U.C. Berkeley. I graduated with an EECS degree in 1975 after a 2 year hiatus in the US Marine Corps as a infantry machine gunner.

I started working when the original Intel 8080 microprocessor was announced. My first product was a wire bonder that had four 8080 microprocessors controlling high speed motors. Lately I have been using the TI MSP430, NXP LPC2300 and the Renesas SH4 microcontrollers.

I write code in assembly, C, C++ and Java and occasionally design a board when needed. Most of the time the code is system level, low level and drivers, but I do write applications. Most embedded devices usually have a PC controller application that I write. The code is used in Windows, Windows CE and proprietary operating systems. I use Visual Studio 2008, IAR and Keil IDEs. I even create single click installations, especially complex ones that require third party installs.

I have developed over 50 products.

I host the UC Berkeley Engineering Alumni Society (South Bay):
http://www.linkedin.com/groups?gid=1851655
http://www.facebook.com/reqs.php#/group.php?gid=57293762711

I live in Silicon Valley, play full court basketball once a week, work out at the gym during the week and hike with my wife on the weekend.

Comments and Discussions

 
PraiseStill works, nice Pin
rvangaal29-Jan-17 4:00
rvangaal29-Jan-17 4:00 
BugVery nice!!! Does leak memory though... Pin
AlhajiBello29-Sep-12 11:11
AlhajiBello29-Sep-12 11:11 
BugSome bug Pin
Alexey Voropaev11-May-12 2:53
Alexey Voropaev11-May-12 2:53 
QuestionLoad time Pin
Chris Millward10-Mar-12 7:36
Chris Millward10-Mar-12 7:36 
There is a problem with incorporating a splash screen into your application directly lie this because what you can't do anything about is the time the Windows loader takes to load your app into memory before execution begins. If you exe is large this could be seconds, meaning seconds before your splash screen is displayed.

An alternative approach: www.chrismillward.com/winprog.html?req=d7
AnswerRe: Load time Pin
Chris Apple10-Mar-12 8:39
Chris Apple10-Mar-12 8:39 
GeneralGetVersionStrings() fails Pin
masteryoda2119-May-09 10:19
masteryoda2119-May-09 10:19 
GeneralRe: GetVersionStrings() fails Pin
Alexey Voropaev11-May-12 2:42
Alexey Voropaev11-May-12 2:42 
GeneralRe: GetVersionStrings() fails Pin
Chris Apple11-May-12 4:55
Chris Apple11-May-12 4:55 
GeneralVery nice! Pin
Hans Dietrich22-Apr-09 0:36
mentorHans Dietrich22-Apr-09 0:36 
GeneralRe: Very nice! Pin
Chris Apple22-Apr-09 3:43
Chris Apple22-Apr-09 3:43 

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.