// File: splash.cpp #include "precomp.h" #include "resource.h" #include "conf.h" #include "GenWindow.h" #include "GenContainers.h" #include "GenControls.h" static const int DXP_LOGO_LEFT = 182; static const int DYP_LOGO_COPYRIGHT = 24; static const int LogoBorder = 10; CFrame *g_pSplashScreen = NULL; HPALETTE PaletteFromBitmap(HINSTANCE hInst, LPCTSTR pszRes) { HRSRC hFind = FindResource(hInst, pszRes, RT_BITMAP); if (NULL == hFind) { return(NULL); } HGLOBAL hRsrc = LoadResource(_Module.GetModuleInstance(), hFind); if (NULL == hRsrc) { return(NULL); } HPALETTE hRet = NULL; LPVOID pRsrc = LockResource(hRsrc); if (NULL != pRsrc) { BITMAPINFO *pbmi = reinterpret_cast(pRsrc); BITMAPINFOHEADER &bmih = pbmi->bmiHeader; ASSERT(1 == bmih.biPlanes); if (8 >= bmih.biBitCount) { RGBQUAD *rgb = pbmi->bmiColors; struct { LOGPALETTE pal; PALETTEENTRY palPalEntry[256]; } myPal; myPal.pal.palVersion = 0x300; myPal.pal.palNumEntries = LOWORD(bmih.biClrUsed); if (0 == myPal.pal.palNumEntries) { myPal.pal.palNumEntries = 1 << bmih.biBitCount; } ASSERT(myPal.pal.palNumEntries <= 1 << bmih.biBitCount); for (int i=myPal.pal.palNumEntries-1; i>=0; --i) { PALETTEENTRY &pe = myPal.pal.palPalEntry[i]; pe.peRed = rgb[i].rgbRed; pe.peGreen = rgb[i].rgbGreen; pe.peBlue = rgb[i].rgbBlue; pe.peFlags = PC_NOCOLLAPSE; } hRet = CreatePalette(&myPal.pal); } UnlockResource(hRsrc); } FreeResource(hRsrc); return(hRet); } class CSplashFrame : public CFrame { public: CSplashFrame() : m_hPal(NULL) {} HPALETTE m_hPal; virtual HPALETTE GetPalette() { return(m_hPal); } protected: ~CSplashFrame() { if (NULL != m_hPal) { DeleteObject(m_hPal); } } } ; static HBITMAP LoadSplashBitmap() { HBITMAP hBmp = (HBITMAP) LoadImage(::GetInstanceHandle(), MAKEINTRESOURCE(IDB_SPLASH), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_CREATEDIBSECTION); if (NULL == hBmp) { ERROR_OUT(("Error loading splash screen bitmap")); return(NULL); } BITMAP bmp; GetObject(hBmp, sizeof(BITMAP), (LPVOID)&bmp); // Create a DC HDC hdc = CreateCompatibleDC(NULL); if (NULL == hdc) { return(hBmp); } // Use the dialog font but make sure it's the right size // it better be a scalable truetype font! LOGFONT logFont; ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(LOGFONT), &logFont ); // Look for a string resource which sets the font size // and set the font size to this value if present USES_RES2T lstrcpy(logFont.lfFaceName, RES2T(IDS_SPLASHFONT)); if ('\0' == logFont.lfFaceName[0]) { lstrcpy(logFont.lfFaceName, TEXT("Arial")); } logFont.lfHeight = - LoadResInt(IDS_SPLASHFONTSIZE, 11); HFONT hFont = CreateFontIndirect (&logFont); if (NULL != hFont) { SelectObject(hdc, hFont); } SelectObject(hdc, hBmp); ::SetTextColor(hdc, RGB(0, 0, 0)); // black // The following code assumes the bitmap is // a certain size, so assert on that here. // If this assertion doesn't hold the text positions // have to be adjusted. ASSERT(bmp.bmWidth == 398); ASSERT(bmp.bmHeight == 245); SetBkMode(hdc, TRANSPARENT); // Do the Copyright message (multiple lines) TCHAR sz[400]; // must be large enuf for owner+company and copyright text FLoadString(IDS_COPYRIGHT, sz, CCHMAX(sz)); RECT rc ={ DXP_LOGO_LEFT, DYP_LOGO_COPYRIGHT, bmp.bmWidth - LogoBorder, bmp.bmHeight - LogoBorder }; DrawText(hdc, sz, -1, &rc, DT_LEFT | DT_NOPREFIX | DT_WORDBREAK); //#define FINAL #ifndef FINAL // Don't just delete this - compile with FINAL defined! { COLORREF bkColor = SetTextColor(hdc, RGB(0xFF, 0, 0)); HFONT hFontBig = CreateFont(-28, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial")); FLoadString(IDS_ABOUT_OTHER, sz, CCHMAX(sz)); if (NULL != hFontBig) { HFONT hOldFont = (HFONT)SelectObject (hdc, hFontBig); SetRect(&rc, 280, 151, bmp.bmWidth, bmp.bmHeight); DrawText(hdc, sz, lstrlen(sz), &rc, DT_SINGLELINE | DT_TOP | DT_LEFT | DT_NOPREFIX); SelectObject(hdc, hOldFont); DeleteObject(hFontBig); } SetTextColor(hdc, bkColor); } #endif /* FINAL */ #undef FINAL DeleteDC(hdc); if (NULL != hFont) { DeleteObject(hFont); } return(hBmp); } VOID UpdateSplashScreen ( VOID ); /* S T A R T S P L A S H S C R E E N */ /*---------------------------------------------------------------------------- %%Function: StartSplashScreen ----------------------------------------------------------------------------*/ VOID StartSplashScreen(HWND hwndParent) { if (NULL != g_pSplashScreen) { return; } CSplashFrame *pFrame = new CSplashFrame(); g_pSplashScreen = pFrame; if (NULL != pFrame) { if (!g_fHiColor) { pFrame->m_hPal = PaletteFromBitmap(_Module.GetModuleInstance(), MAKEINTRESOURCE(IDB_SPLASH)); } if (pFrame->Create(hwndParent, g_szEmpty, WS_POPUP | WS_BORDER, WS_EX_TOOLWINDOW | g_wsLayout, -1000, -1000, 10, 10, _Module.GetModuleInstance())) { CBitmapButton *pButton = new CBitmapButton(); if (NULL != pButton) { HBITMAP hBmp = LoadSplashBitmap(); pButton->Create(pFrame->GetWindow(), 0, hBmp, 1); pFrame->Resize(); pFrame->Layout(); pButton->Layout(); pFrame->MoveEnsureVisible(-1000, -1000); ShowWindow(pFrame->GetWindow(), SW_SHOW); UpdateSplashScreen(); pButton->Release(); } } } } /* S T O P S P L A S H S C R E E N */ /*---------------------------------------------------------------------------- %%Function: StopSplashScreen ----------------------------------------------------------------------------*/ VOID StopSplashScreen ( VOID ) { if (NULL != g_pSplashScreen) { HWND hwnd = g_pSplashScreen->GetWindow(); if (NULL != hwnd) { DestroyWindow(hwnd); } g_pSplashScreen->Release(); g_pSplashScreen = NULL; } } /* U P D A T E S P L A S H S C R E E N */ /*---------------------------------------------------------------------------- %%Function: UpdateSplashScreen ----------------------------------------------------------------------------*/ VOID UpdateSplashScreen ( VOID ) { if (NULL != g_pSplashScreen) { HWND hwnd = g_pSplashScreen->GetWindow(); if (NULL != hwnd) { RedrawWindow(hwnd, NULL, NULL, RDW_ALLCHILDREN|RDW_UPDATENOW); } } }