Splash.cpp
资源名称:Netmanag.zip [点击查看]
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:4k
源码类别:
Ftp客户端
开发平台:
Visual C++
- // MySplashWnd.cpp : implementation file
- //
- #include "stdafx.h"
- #include "RichEdit.h"
- #include "Splash.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CMySplashWnd
- CMySplashWnd::CMySplashWnd(UINT nBitmapID, UINT nDuration /*= 2500*/)
- {
- m_nBitmapID = nBitmapID;
- m_nDuration = nDuration;
- }
- BEGIN_MESSAGE_MAP(CMySplashWnd, CWnd)
- //{{AFX_MSG_MAP(CMySplashWnd)
- ON_WM_PAINT()
- ON_WM_TIMER()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- BOOL CMySplashWnd::Create()
- {
- if( !GetBitmapAndPalette(m_nBitmapID, m_bitmap, m_pal) )
- {
- TRACE1( "Could not load bitmap resource - %dn", m_nBitmapID );
- return FALSE;
- }
- BITMAP bm;
- m_bitmap.GetObject(sizeof(BITMAP), &bm);
- // First create an invisible window
- m_wndInvisible.CreateEx(WS_EX_TOPMOST, AfxRegisterWndClass(CS_CLASSDC),
- _T(""), WS_POPUP, 0, 0, bm.bmWidth, bm.bmHeight, NULL, NULL);
- // Create the the splash window with invisible parent as parent
- BOOL bRetVal = CWnd::CreateEx(WS_EX_TOPMOST, AfxRegisterWndClass(CS_CLASSDC),
- _T(""), WS_POPUP, 0, 0, bm.bmWidth, bm.bmHeight, m_wndInvisible.m_hWnd, NULL);
- CenterWindow();
- ShowWindow(SW_SHOW);
- UpdateWindow();
- //Create the timer.
- m_nTimerID = SetTimer(1, m_nDuration, NULL);
- ASSERT(m_nTimerID);
- return bRetVal;
- }
- BOOL CMySplashWnd::GetBitmapAndPalette(UINT nIDResource, CBitmap &bitmap, CPalette &pal)
- {
- LPCTSTR lpszResourceName = (LPCTSTR)nIDResource;
- HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),
- lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );
- if( hBmp == NULL )
- return FALSE;
- bitmap.Attach( hBmp );
- // Create a logical palette for the bitmap
- DIBSECTION ds;
- BITMAPINFOHEADER &bmInfo = ds.dsBmih;
- bitmap.GetObject( sizeof(ds), &ds );
- int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
- // Create a halftone palette if colors > 256.
- CClientDC dc(NULL); // Desktop DC
- if( nColors > 256 )
- pal.CreateHalftonePalette( &dc );
- else
- {
- // Create the palette
- RGBQUAD *pRGB = new RGBQUAD[nColors];
- CDC memDC;
- memDC.CreateCompatibleDC(&dc);
- memDC.SelectObject( &bitmap );
- ::GetDIBColorTable( memDC, 0, nColors, pRGB );
- UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
- LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
- pLP->palVersion = 0x300;
- pLP->palNumEntries = nColors;
- for( int i=0; i < nColors; i++)
- {
- pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
- pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
- pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
- pLP->palPalEntry[i].peFlags = 0;
- }
- pal.CreatePalette( pLP );
- delete[] pLP;
- delete[] pRGB;
- }
- return TRUE;
- }
- void CMySplashWnd::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- // Create a memory DC compatible with the paint DC
- CDC memDC;
- memDC.CreateCompatibleDC( &dc );
- CBitmap *pBmpOld = memDC.SelectObject( &m_bitmap );
- // Select and realize the palette
- if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
- {
- dc.SelectPalette( &m_pal, FALSE );
- dc.RealizePalette();
- }
- // Window is same size as bitmap
- CRect rcWnd;
- GetWindowRect( &rcWnd );
- dc.BitBlt(0, 0, rcWnd.Width(), rcWnd.Height(), &memDC, 0, 0,SRCCOPY);
- // Restore bitmap in memDC
- memDC.SelectObject( pBmpOld );
- // Do not call CWnd::OnPaint() for painting messages
- }
- void CMySplashWnd::OnTimer(UINT nIDEvent)
- {
- if (m_nTimerID == nIDEvent)
- {
- //Destroy the timer and splash window
- KillTimer(m_nTimerID);
- m_wndInvisible.DestroyWindow();
- delete this;
- return;
- }
- CWnd::OnTimer(nIDEvent);
- }
- BOOL CMySplashWnd::PreTranslateMessage(MSG* pMsg)
- {
- ASSERT(pMsg != NULL);
- if (pMsg->message == WM_KEYDOWN ||
- pMsg->message == WM_SYSKEYDOWN ||
- pMsg->message == WM_LBUTTONDOWN ||
- pMsg->message == WM_RBUTTONDOWN ||
- pMsg->message == WM_MBUTTONDOWN )
- {
- //Destroy the timer and splash window
- KillTimer(m_nTimerID);
- m_wndInvisible.DestroyWindow();
- delete this;
- return 1;
- }
- return CWnd::PreTranslateMessage(pMsg);
- }