WindowsXP-SP1/enduser/stuff/hhctrl/splash.cpp

179 lines
4.3 KiB
C++

// Copyright (C) 1996-1997 Microsoft Corporation. All rights reserved.
#include "header.h"
#include "hhctrl.h"
#include "cpaldc.h"
#ifdef _DEBUG
#undef THIS_FILE
static const char THIS_FILE[] = __FILE__;
#endif
const char g_wcSplash[] = "Splash";
const int CB_BORDER = 2; // Width of the border we draw around splash window
const int SHADOW_WIDTH = 6; // Shadow border
const int SHADOW_HEIGHT = 6;
#define IDSPLASH_TIMER 9999
static BITMAP bmpSplash;
LRESULT SplashWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void CHtmlHelpControl::CreateSplash(void)
{
ASSERT(m_ptblItems);
if (!m_ptblItems || m_ptblItems->CountStrings() < 1)
return;
char szBitmap[MAX_PATH];
// If current video display supports more then 256 colors, then check
// for an alternate image in Item3. Note that this requires
// the author to specify a timeout value for Item2.
if (m_ptblItems->CountStrings() > 2) {
HDC hdc = CreateIC("DISPLAY", NULL, NULL, NULL);
if( hdc && GetDeviceCaps(hdc, BITSPIXEL) > 8) {
if (!ConvertToCacheFile(m_ptblItems->GetPointer(1), szBitmap))
return;
else
goto GotImageFile;
}
if( hdc )
DeleteDC( hdc );
}
if (!ConvertToCacheFile(m_ptblItems->GetPointer(1), szBitmap))
return;
GotImageFile:
if (stristr(szBitmap, ".gif")) {
if (!LoadGif(szBitmap, &g_hbmpSplash, &g_hpalSplash, this))
return;
}
// REVIEW: If we are on a 256-color system, read the color information
// and create a palette
else {
g_hbmpSplash = (HBITMAP) LoadImage(_Module.GetResourceInstance(), szBitmap, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
}
if (!g_hbmpSplash) {
// BUGBUG: nag the help author
return;
}
GetObject(g_hbmpSplash, sizeof(bmpSplash), &bmpSplash);
if (!g_fRegisteredSpash) {
WNDCLASS wc;
ZERO_STRUCTURE(wc);
wc.lpfnWndProc = SplashWndProc;
wc.hInstance = _Module.GetModuleInstance();
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = g_wcSplash;
if (!RegisterClass(&wc))
return; // REVIEW: should we notify the help author?
g_fRegisteredSpash = TRUE;
}
RECT rc;
// Find the parent window so the splash screen is centered over the parent
{
HWND hwndParent = GetParent(m_hwnd);
#if defined(_DEBUG)
char szClass[256];
#endif
while (GetWindowLong(hwndParent, GWL_STYLE) & WS_CHILD) {
HWND hwnd = GetParent(hwndParent);
if (IsValidWindow(hwnd)) {
hwndParent = hwnd;
#if defined(_DEBUG)
GetClassName(hwndParent, szClass, sizeof(szClass));
#endif
}
else
break;
}
GetWindowRect(hwndParent, &rc);
}
g_hwndSplash = CreateWindowEx(WS_EX_TOPMOST, g_wcSplash, "",
WS_POPUP | WS_VISIBLE,
rc.left +
RECT_WIDTH(rc) / 2 - (bmpSplash.bmWidth / 2),
rc.top +
RECT_HEIGHT(rc) / 2 - (bmpSplash.bmHeight / 2),
bmpSplash.bmWidth + CB_BORDER * 2 + SHADOW_WIDTH,
bmpSplash.bmHeight + CB_BORDER * 2 + SHADOW_HEIGHT,
NULL, NULL, _Module.GetModuleInstance(), NULL);
if (!g_hwndSplash)
return;
// Default to 3 seconds before deleting the splash window
SetTimer(g_hwndSplash, IDSPLASH_TIMER,
m_ptblItems->CountStrings() > 1 ?
(UINT) Atoi(m_ptblItems->GetPointer(2)) : 2500, NULL);
}
LRESULT SplashWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_CREATE:
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)
((CREATESTRUCT*) lParam)->lpCreateParams);
return 0;
case WM_ERASEBKGND:
{
HDC hdc = (HDC) wParam;
PaintShadowBackground(hwnd, hdc);
CPalDC cdc(g_hbmpSplash, g_hpalSplash);
HPALETTE hpalOld;
if (g_hpalSplash) {
hpalOld = SelectPalette(hdc, g_hpalSplash, FALSE);
RealizePalette(hdc);
}
BitBlt(hdc, CB_BORDER, CB_BORDER, bmpSplash.bmWidth,
bmpSplash.bmHeight, cdc.m_hdc, 0, 0, SRCCOPY);
if (g_hpalSplash)
SelectPalette(hdc, hpalOld, FALSE);
}
return TRUE;
case WM_TIMER:
if (wParam == IDSPLASH_TIMER) {
KillTimer(hwnd, IDSPLASH_TIMER);
DestroyWindow(hwnd);
g_hwndSplash = NULL;
}
return 0;
case WM_LBUTTONDOWN:
DestroyWindow(hwnd);
g_hwndSplash = NULL;
return 0;
case WM_RBUTTONDOWN:
DestroyWindow(hwnd);
g_hwndSplash = NULL;
// DisplayCredits();
return 0;
default:
return (DefWindowProc(hwnd, msg, wParam, lParam));
}
return 0;
}