Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

         

Класс CSplashWnd


Практически весь программный код, отвечающий за отображение заставки Splash Screen, содержится в классе CSplashWnd. Этот класс включается в состав проекта и вы можете просмотреть его содержимое в окне проекта Project Workspace на странице ClassView (рис. 2.4).

Рис. 2.4. Окно Project Workspace, класс CSplashWnd

Определение класса CSplashWnd находится в файле Splash.h. Мы привели его полностью в листинге 2.1.

Класс CSplashWnd создан на основе базового класса CWnd. Он включает в себя ряд методов и несколько элементов данных. Класс CSplashWnd может обрабатывать сообщения, поэтому для него в  файле Splash.h определена макрокоманда DECLARE_MESSAGE_MAP, а в файле реализации - Splash.cpp - таблица сообщений класса.

Листинг 2.1. Файл Splash.h

// CG: This file was added by the Splash Screen component.

#ifndef _SPLASH_SCRN_

#define _SPLASH_SCRN_

// Splash.h : header file

//

//////////////////////////////////////////////////////////////

//   Splash Screen class

class CSplashWnd : public CWnd

{

// Construction

protected:

   CSplashWnd();

// Attributes:

public:

   CBitmap m_bitmap;

// Operations

public:

   static void EnableSplashScreen(BOOL bEnable = TRUE);

   static void ShowSplashScreen(CWnd* pParentWnd = NULL);

   static void PreTranslateAppMessage(MSG* pMsg);

// Overrides

   // ClassWizard generated virtual function overrides

   //{{AFX_VIRTUAL(CSplashWnd)

   //}}AFX_VIRTUAL

// Implementation

public:

   ~CSplashWnd();

   virtual void PostNcDestroy();

protected:

   BOOL Create(CWnd* pParentWnd = NULL);

   void HideSplashScreen();

   static BOOL c_bShowSplashWnd;

   static CSplashWnd* c_pSplashWnd;

// Generated message map functions

protected:

   //{{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;

}

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, 750, NULL);

   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);

}

void CSplashWnd::OnTimer(UINT nIDEvent)

{

   // Destroy the splash screen window.

   HideSplashScreen();

}

Вы всегда можете получить файл Splash.cpp следуя инструкциям в начале раздела “Заставка для приложения”. Теперь опишем отдельные методы класса.


Содержание раздела