URL
https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk
Subversion Repositories openrisc_2011-10-31
[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [tools/] [src/] [tools/] [configtool/] [standalone/] [win32/] [splash.cpp] - Rev 174
Compare with Previous | Blame | View Log
//####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 ; }