Чтение онлайн

ЖАНРЫ

Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2

Фролов Григорий Вячеславович

Шрифт:

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.

Деструктор класса CSplashWnd также не содержит ничего сложного, он используется исключительно для записи в указатель c_pSplashWnd значения NULL:

c_pSplashWnd = NULL;

Таблица сообщений класса CSplashWnd

Таблица сообщений класса CSplashWnd содержит всего три макрокоманды, которые расположены внутри блока //{{AFX_MSG_MAP и поэтому управляются через ClassWizard:

BEGIN_MESSAGE_MAP(CSplashWnd, CWnd)

 //{{AFX_MSG_MAP(CSplashWnd)

 ON_WM_CREATE

 ON_WM_PAINT

 ON_WM_TIMER

 //}}AFX_MSG_MAP

END_MESSAGE_MAP

Две макрокоманды таблицы сообщений класса CSplashWnd уже давно вам знакомы. Это макрокоманда ON_WM_CREATE, которая вызывает метод OnCreate во время создания окна заставки (обработка сообщения WM_CREATE), и макрокоманда ON_WM_PAINT, которая вызывает метод OnPaint, когда надо перерисовать окно (обработка сообщения WM_PAINT).

Поделиться с друзьями: