Mercurial > flash_v2
diff host/tools/configtool/standalone/win32/splash.cpp @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/host/tools/configtool/standalone/win32/splash.cpp @@ -0,0 +1,282 @@ +//####COPYRIGHTBEGIN#### +// +// ---------------------------------------------------------------------------- +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// +// This program is part of the eCos host tools. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the Free Software Foundation, Inc., +// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +// ---------------------------------------------------------------------------- +// +//####COPYRIGHTEND#### +// CG: This file was added by the Splash Screen component. +// Splash.cpp : implementation file +// +// +//=========================================================================== +//=========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): sdf +// Contact(s): sdf +// Date: 1998/08/11 +// Version: 0.01 +// Purpose: +// Description: This is the implementation of the splash screen class. +// Requires: +// Provides: +// See also: +// Known bugs: +// Usage: +// +//####DESCRIPTIONEND#### +// +//=========================================================================== + +#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 + +IMPLEMENT_DYNAMIC( CSplashWnd, CWnd ) + + + +///////////////////////////////////////////////////////////////////////////// +// 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*/) +{ + if(c_pSplashWnd != NULL && !bEnable){ + c_pSplashWnd->HideSplashScreen(); + } + 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)) + { + deleteZ(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*/) +{ + UINT image = IDB_SPLASH; + if (!m_bitmap.LoadBitmap(image)) + return FALSE; + + BITMAP bm; + m_bitmap.GetBitmap(&bm); + + BOOL rc=CreateEx(0, + AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)), + NULL, WS_POPUP | WS_VISIBLE, 0, 0, bm.bmWidth, bm.bmHeight, pParentWnd->GetSafeHwnd(), NULL); + m_hBitmap = LoadResourceBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(image)); + m_pBitmap = CBitmap::FromHandle(m_hBitmap); + return rc; +} + +HBITMAP CSplashWnd::LoadResourceBitmap(HINSTANCE hInstance, LPCTSTR lpString) + +{ + HGLOBAL hGlobal; + HBITMAP hBitmapFinal = NULL; + LPBITMAPINFOHEADER lpbi; + HDC hdc; + CDC* dc; + int iNumColors; + HRSRC hRsrc = FindResource(hInstance, lpString, RT_BITMAP); + + if (hRsrc) + { + hGlobal = LoadResource(hInstance, hRsrc); + lpbi = (LPBITMAPINFOHEADER)LockResource(hGlobal); + CreateDIBPalette ((LPBITMAPINFO)lpbi, &iNumColors); + + dc = GetDC(); + hdc = dc->GetSafeHdc(); + CPalette* oldpal = dc->SelectPalette(&Palette,FALSE); + dc->RealizePalette(); + hBitmapFinal = CreateDIBitmap(hdc, + (LPBITMAPINFOHEADER)lpbi, + (LONG)CBM_INIT, + (LPSTR)lpbi + lpbi->biSize + iNumColors * + sizeof(RGBQUAD), + (LPBITMAPINFO)lpbi, + DIB_RGB_COLORS ); + dc->SelectPalette(oldpal,FALSE); + dc->RealizePalette(); + + ReleaseDC( dc ); + UnlockResource(hGlobal); + FreeResource(hGlobal); + } + return (hBitmapFinal); +} + +void CSplashWnd::HideSplashScreen() +{ + // Destroy the window, and update the mainframe. + DestroyWindow(); + CWnd *pWnd=AfxGetMainWnd(); + if(pWnd) + { + pWnd->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, 3000, 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); + + for(int i=0;i<bm.bmHeight;i++){ + COLORREF col=PALETTERGB(0,0,(255*i)/bm.bmHeight); + CRect rect(0,i,bm.bmWidth,i+2); + dcImage.FillSolidRect(&rect, col); + } + dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, MERGEPAINT); + +} + +void CSplashWnd::OnTimer(UINT nIDEvent) +{ + // Destroy the splash screen window. + HideSplashScreen(); + UNUSED_ALWAYS(nIDEvent); +} + +void CSplashWnd::CreateDIBPalette (LPBITMAPINFO lpbmi, LPINT lpiNumColors) +{ + LPBITMAPINFOHEADER lpbi; + LPLOGPALETTE lpPal; + HANDLE hLogPal; + int i; + + lpbi = (LPBITMAPINFOHEADER)lpbmi; + if (lpbi->biBitCount <= 8) + *lpiNumColors = (1 << lpbi->biBitCount); + else + *lpiNumColors = 0; // No palette needed for 24 BPP DIB + + if (*lpiNumColors) + { + hLogPal = GlobalAlloc (GHND, sizeof (LOGPALETTE) + + sizeof (PALETTEENTRY) * (*lpiNumColors)); + lpPal = (LPLOGPALETTE) GlobalLock (hLogPal); + lpPal->palVersion = 0x300; + lpPal->palNumEntries = (unsigned short)*lpiNumColors; + + for (i = 0; i < *lpiNumColors; i++) + { + lpPal->palPalEntry[i].peRed = lpbmi->bmiColors[i].rgbRed; + lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen; + lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue; + lpPal->palPalEntry[i].peFlags = 0; + } + Palette.CreatePalette(lpPal); + GlobalUnlock (hLogPal); + GlobalFree (hLogPal); + } + return ; +}
