173 lines
3.9 KiB
C++
173 lines
3.9 KiB
C++
// CG: This file was added by the Splash Screen component.
|
|
// Splash.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h" // e. g. stdafx.h
|
|
#include "resource.h" // e.g. resource.h
|
|
|
|
#include "Splash.h" // e.g. splash.h
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Splash Screen class
|
|
|
|
BOOL CSplashWnd::c_bShowSplashWnd;
|
|
CSplashWnd* CSplashWnd::c_pSplashWnd;
|
|
CSplashWnd::CSplashWnd()
|
|
{
|
|
}
|
|
|
|
CSplashWnd::~CSplashWnd()
|
|
{
|
|
// Clear the static window pointer.
|
|
ASSERT(c_pSplashWnd == this);
|
|
c_pSplashWnd = NULL;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)
|
|
//{{AFX_MSG_MAP(CSplashWnd)
|
|
ON_WM_CREATE()
|
|
ON_WM_PAINT()
|
|
ON_WM_TIMER()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
// the default string here was just centred by eye, if it gets changed it'll need adjusting to fit the box centre...
|
|
//
|
|
#define SPLASH_DEFAULT_TEXT " ( Wait... )"
|
|
|
|
bool gbSplashScreenRunning = false;
|
|
bool gbSplashNotNeededByApp = false;
|
|
bool gbSplashScreenNotNeededByTimer = false;
|
|
CString strSplashText = SPLASH_DEFAULT_TEXT;
|
|
void CSplashWnd::StatusMessage(LPCSTR psMessage) // can be NULL for "not bothered"
|
|
{
|
|
strSplashText = psMessage ? psMessage : SPLASH_DEFAULT_TEXT;
|
|
strSplashText.TrimRight(); // remove trailing CRs which show up as black marks
|
|
c_pSplashWnd->RedrawWindow();
|
|
}
|
|
|
|
void CSplashWnd::EnableSplashScreen(BOOL bEnable /*= TRUE*/)
|
|
{
|
|
c_bShowSplashWnd = bEnable;
|
|
}
|
|
|
|
void CSplashWnd::ShowSplashScreen(CWnd* pParentWnd /*= NULL*/)
|
|
{
|
|
if (!c_bShowSplashWnd || c_pSplashWnd != NULL)
|
|
return;
|
|
|
|
// Allocate a new splash screen, and create the window.
|
|
c_pSplashWnd = new CSplashWnd;
|
|
if (!c_pSplashWnd->Create(pParentWnd))
|
|
delete c_pSplashWnd;
|
|
else
|
|
c_pSplashWnd->UpdateWindow();
|
|
}
|
|
|
|
BOOL CSplashWnd::PreTranslateAppMessage(MSG* pMsg)
|
|
{
|
|
if (c_pSplashWnd == NULL)
|
|
return FALSE;
|
|
/*
|
|
// If we get a keyboard or mouse message, hide the splash screen.
|
|
if (pMsg->message == WM_KEYDOWN ||
|
|
pMsg->message == WM_SYSKEYDOWN ||
|
|
pMsg->message == WM_LBUTTONDOWN ||
|
|
pMsg->message == WM_RBUTTONDOWN ||
|
|
pMsg->message == WM_MBUTTONDOWN ||
|
|
pMsg->message == WM_NCLBUTTONDOWN ||
|
|
pMsg->message == WM_NCRBUTTONDOWN ||
|
|
pMsg->message == WM_NCMBUTTONDOWN)
|
|
{
|
|
c_pSplashWnd->HideSplashScreen(false);
|
|
return TRUE; // message handled here
|
|
}
|
|
*/
|
|
return FALSE; // message not handled
|
|
}
|
|
|
|
BOOL CSplashWnd::Create(CWnd* pParentWnd /*= NULL*/)
|
|
{
|
|
if (!m_bitmap.LoadBitmap(IDB_SPLASH))
|
|
return FALSE;
|
|
|
|
BITMAP bm;
|
|
m_bitmap.GetBitmap(&bm);
|
|
|
|
return CreateEx(0,
|
|
AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
|
|
NULL, WS_POPUP | WS_VISIBLE, 0, 0, bm.bmWidth, bm.bmHeight, pParentWnd->GetSafeHwnd(), NULL);
|
|
}
|
|
|
|
void CSplashWnd::HideSplashScreen(bool bCalledFromApp)
|
|
{
|
|
if (bCalledFromApp)
|
|
{
|
|
gbSplashNotNeededByApp = true;
|
|
return;
|
|
}
|
|
|
|
if (gbSplashNotNeededByApp && gbSplashScreenNotNeededByTimer)
|
|
{
|
|
// Destroy the window, and update the mainframe.
|
|
c_pSplashWnd->DestroyWindow();
|
|
AfxGetMainWnd()->UpdateWindow();
|
|
}
|
|
}
|
|
|
|
void CSplashWnd::PostNcDestroy()
|
|
{
|
|
// Free the C++ class.
|
|
delete this;
|
|
|
|
gbSplashScreenRunning = false;
|
|
}
|
|
|
|
int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CWnd::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
// Center the window.
|
|
CenterWindow();
|
|
|
|
// Set a timer to destroy the splash screen.
|
|
SetTimer(1, 1000, NULL);
|
|
|
|
gbSplashScreenRunning = true;
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CSplashWnd::OnPaint()
|
|
{
|
|
CPaintDC dc(this);
|
|
|
|
CDC dcImage;
|
|
if (!dcImage.CreateCompatibleDC(&dc))
|
|
return;
|
|
|
|
BITMAP bm;
|
|
m_bitmap.GetBitmap(&bm);
|
|
|
|
// Paint the image.
|
|
CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);
|
|
dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
|
|
dcImage.SelectObject(pOldBitmap);
|
|
|
|
dc.TextOut(58/*bm.bmWidth/2*/,180/*bm.bmHeight/2*/, strSplashText);
|
|
}
|
|
|
|
void CSplashWnd::OnTimer(UINT nIDEvent)
|
|
{
|
|
gbSplashScreenNotNeededByTimer = true;
|
|
HideSplashScreen(false);
|
|
}
|