//{{AFX_MSG(CSplashWnd)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnPaint;
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP
};
#endif
Методы класса CSplashWnd определены в файле реализации – Splash.cpp. Этот файл также добавляется к проекту Multi. Мы привели полный исходный текст этого файла в листинге 2.2.
Листинг 2.2. Файл Splash.cpp
// CG: Файл Splash.cpp добавляется в проект во время вставки
// компонента Splash Screen и содержит реализацию класса
// CSplashWnd
#include "stdafx.h"
#include "resource.h"
#include "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
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;
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{
// Destroy the window, and update the mainframe.
DestroyWindow;
AfxGetMainWnd->UpdateWindow;
}
void CSplashWnd::PostNcDestroy{
// Free the C++ class.
delete this;
}