Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Microsoft Visual C++ ΠΈ MFC. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для Windows 95 ΠΈ Windows NT. Π§Π°ΡΡ‚ΡŒ 2Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 13

Автор АлСксандр Π€Ρ€ΠΎΠ»ΠΎΠ²

Если ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateAppMessage класса CSplashWnd Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE, Ρ‚ΠΎΠ³Π΄Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateAppMessage класса CMultiApp Ρ‚Π°ΠΊΠΆΠ΅ сразу Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE. БообщСния, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ классом CSplashWnd Π±ΠΎΠ»Π΅Π΅ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Если ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateAppMessage класса CSplashWnd Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE, Ρ‚ΠΎΠ³Π΄Π° вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateMessage Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CWinApp.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateMessage класса CWinApp выполняСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ сообщСний, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выдСляСт сообщСния ΠΎΡ‚ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ комбинациям клавиш, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ аксСлСраторов ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΈΡ… Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½Ρ‹Π΅ сообщСния. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ аксСлСраторов Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ β€œΠ’Π°Π±Π»ΠΈΡ†Π° аксСлСраторов” Π³Π»Π°Π²Ρ‹ β€œΠœΠ΅Π½ΡŽ, ΠΏΠ°Π½Π΅Π»ΠΈ управлСния ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ состояния”, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² 13 Ρ‚ΠΎΠΌΠ΅ сСрии β€œΠ‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° систСмного программиста”:

BOOL CMultiApp::PreTranslateMessage(MSG* pMsg) {

 // CG: The following lines were added by the Splash Screen

 // component.

 if (CSplashWnd::PreTranslateAppMessage(pMsg)) return TRUE;


 return CWinApp::PreTranslateMessage(pMsg);

}

Π’ случаС, Ссли сообщСниС пСрСдаСтся для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ PreTranslateMessage Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса CWinApp – CWinApp::PreTranslateMessage, ΠΌΠ΅Ρ‚ΠΎΠ΄ PreTranslateMessage класса CMultiApp Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠœΠ΅Ρ‚ΠΎΠ΄ OnCreate класса CMainFrame

ΠœΠ΅Ρ‚ΠΎΠ΄ OnCreate создаСт Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π² Π½Π΅ΠΌ ΠΏΠ°Π½Π΅Π»ΠΈ управлСния ΠΈ состояния. ОписаниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° OnCreate класса CMainFrame Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ β€œΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Multi”.

Π’ΠΎ врСмя добавлСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Splash Screen ΠΌΠ΅Ρ‚ΠΎΠ΄ OnCreate класса CMainFrame модифицируСтся. К Π½Π΅ΠΌΡƒ добавляСтся Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ShowSplashScreen класса CSplashWnd.

ΠœΠ΅Ρ‚ΠΎΠ΄ ShowSplashScreen класса CSplashWnd, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π½Π° экранС ΠΎΠΊΠ½ΠΎ заставки, Π±ΡƒΠ΄Π΅Ρ‚ описан Π½Π°ΠΌΠΈ ΠΏΠΎΠ·ΠΆΠ΅:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {

 // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ OnCreate Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса

 if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;


 // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ панСль управлСния toolbar

 if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {

  // Ошибка ΠΏΡ€ΠΈ создании ΠΏΠ°Π½Π΅Π»ΠΈ управлСния toolbar

  TRACE0("Failed to create toolbar\n");

  return -1;

 }


 // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ панСль состояния status bar

 if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) {

  // Ошибка ΠΏΡ€ΠΈ создании ΠΏΠ°Π½Π΅Π»ΠΈ состояния status bar

  TRACE0("Failed to create status bar\n");

  return -1;

 }


 // TODO: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ характСристики ΠΏΠ°Π½Π΅Π»ΠΈ

 // управлСния, ΡƒΠ±Ρ€Π°Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ CBRS_

 m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

 // TODO: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ управлСния,

 // Ссли ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

 EnableDocking(CBRS_ALIGN_ANY);

 DockControlBar(&m_wndToolBar);


 // CG: The following line was added by the Splash Screen

 // component.

 CSplashWnd::ShowSplashScreen(this);

 return 0;

}

Класс 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

Листинг 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 слСдуя инструкциям Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π·Π΄Π΅Π»Π° β€œΠ—Π°ΡΡ‚Π°Π²ΠΊΠ° для прилоТСния”. Π’Π΅ΠΏΠ΅Ρ€ΡŒ опишСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΈ дСструктор класса CSplashWnd

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса CSplashWnd Π½Π΅ содСрТит ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ, Ссли Ρ€Π΅ΡˆΠΈΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Splash Screen.