Splash.cpp
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:4k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // MySplashWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "RichEdit.h"
  5. #include "Splash.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMySplashWnd
  13. CMySplashWnd::CMySplashWnd(UINT nBitmapID, UINT nDuration /*= 2500*/)
  14. {
  15.   m_nBitmapID = nBitmapID;
  16.   m_nDuration = nDuration;
  17. }
  18. BEGIN_MESSAGE_MAP(CMySplashWnd, CWnd)
  19.   //{{AFX_MSG_MAP(CMySplashWnd)
  20.   ON_WM_PAINT()
  21.   ON_WM_TIMER()
  22.   //}}AFX_MSG_MAP
  23. END_MESSAGE_MAP()
  24. BOOL CMySplashWnd::Create()
  25. {
  26.   if( !GetBitmapAndPalette(m_nBitmapID, m_bitmap, m_pal) )
  27.   {
  28.     TRACE1( "Could not load bitmap resource - %dn", m_nBitmapID );
  29.     return FALSE;
  30.   }
  31.   BITMAP bm;
  32.   m_bitmap.GetObject(sizeof(BITMAP), &bm);
  33.   // First create an invisible window
  34.   m_wndInvisible.CreateEx(WS_EX_TOPMOST, AfxRegisterWndClass(CS_CLASSDC), 
  35.                   _T(""), WS_POPUP, 0, 0, bm.bmWidth, bm.bmHeight, NULL, NULL);
  36.   // Create the the splash window with invisible parent as parent
  37.   BOOL bRetVal = CWnd::CreateEx(WS_EX_TOPMOST, AfxRegisterWndClass(CS_CLASSDC), 
  38.                   _T(""), WS_POPUP, 0, 0, bm.bmWidth, bm.bmHeight, m_wndInvisible.m_hWnd, NULL);
  39.   CenterWindow();
  40.   ShowWindow(SW_SHOW);
  41.   UpdateWindow();
  42.   //Create the timer.
  43.   m_nTimerID = SetTimer(1, m_nDuration, NULL);
  44.   ASSERT(m_nTimerID);
  45.   return bRetVal;
  46. }
  47. BOOL CMySplashWnd::GetBitmapAndPalette(UINT nIDResource, CBitmap &bitmap, CPalette &pal)
  48. {
  49.   LPCTSTR lpszResourceName = (LPCTSTR)nIDResource;
  50.   HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
  51.                   lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );
  52.   if( hBmp == NULL ) 
  53.     return FALSE;
  54.   bitmap.Attach( hBmp );
  55.   // Create a logical palette for the bitmap
  56.   DIBSECTION ds;
  57.   BITMAPINFOHEADER &bmInfo = ds.dsBmih;
  58.   bitmap.GetObject( sizeof(ds), &ds );
  59.   int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
  60.   // Create a halftone palette if colors > 256. 
  61.   CClientDC dc(NULL);                     // Desktop DC
  62.   if( nColors > 256 )
  63.     pal.CreateHalftonePalette( &dc );
  64.   else
  65.   {
  66.     // Create the palette
  67.     RGBQUAD *pRGB = new RGBQUAD[nColors];
  68.     CDC memDC;
  69.     memDC.CreateCompatibleDC(&dc);
  70.     memDC.SelectObject( &bitmap );
  71.     ::GetDIBColorTable( memDC, 0, nColors, pRGB );
  72.     UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
  73.     LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
  74.     pLP->palVersion = 0x300;
  75.     pLP->palNumEntries = nColors;
  76.     for( int i=0; i < nColors; i++)
  77.     {
  78.       pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
  79.       pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
  80.       pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
  81.       pLP->palPalEntry[i].peFlags = 0;
  82.     }
  83.     pal.CreatePalette( pLP );
  84.     delete[] pLP;
  85.     delete[] pRGB;
  86.   }
  87.   return TRUE;
  88. }
  89. void CMySplashWnd::OnPaint() 
  90. {
  91.   CPaintDC dc(this); // device context for painting
  92.   // Create a memory DC compatible with the paint DC
  93.   CDC memDC;
  94.   memDC.CreateCompatibleDC( &dc );
  95.   CBitmap *pBmpOld = memDC.SelectObject( &m_bitmap );
  96.   // Select and realize the palette
  97.   if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
  98.   {
  99.     dc.SelectPalette( &m_pal, FALSE );
  100.     dc.RealizePalette();
  101.   }
  102.   // Window is same size as bitmap
  103.   CRect rcWnd;
  104.   GetWindowRect( &rcWnd );
  105.   dc.BitBlt(0, 0, rcWnd.Width(), rcWnd.Height(), &memDC, 0, 0,SRCCOPY);
  106.   // Restore bitmap in memDC
  107.   memDC.SelectObject( pBmpOld );
  108.   // Do not call CWnd::OnPaint() for painting messages
  109. }
  110. void CMySplashWnd::OnTimer(UINT nIDEvent) 
  111. {
  112.   if (m_nTimerID == nIDEvent)
  113.   {       
  114.     //Destroy the timer and splash window
  115.     KillTimer(m_nTimerID);
  116.     m_wndInvisible.DestroyWindow();         
  117.     delete this;
  118.     return;
  119.   }        
  120.   CWnd::OnTimer(nIDEvent);
  121. }
  122. BOOL CMySplashWnd::PreTranslateMessage(MSG* pMsg) 
  123. {
  124.   ASSERT(pMsg != NULL);
  125.   if (pMsg->message == WM_KEYDOWN ||
  126.       pMsg->message == WM_SYSKEYDOWN ||
  127.       pMsg->message == WM_LBUTTONDOWN ||
  128.       pMsg->message == WM_RBUTTONDOWN ||
  129.       pMsg->message == WM_MBUTTONDOWN )
  130.   {
  131.     //Destroy the timer and splash window
  132.     KillTimer(m_nTimerID);
  133.     m_wndInvisible.DestroyWindow();         
  134.     delete this;
  135.     return 1;
  136.   }        
  137.   return CWnd::PreTranslateMessage(pMsg);
  138. }