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