天天看點

vs 啟動畫面

//CSplashWindow.h

class CSplashWindow : public CWnd

{

private:

  CDC MemDC;

  BITMAP bmBitmap;

  CBitmap m_Bitmap;

  CBitmap *Old_Bitmap;

public:

  CSplashWindow();

  ~CSplashWindow();

  void CreateSplash();

  afx_msg void OnPaint();

  DECLARE_MESSAGE_MAP()

};

// SplashWindow.cpp : CSplashWindow 類的實作

#include "stdafx.h"

#include "resource.h"

#include "SplashWindow.h"

BEGIN_MESSAGE_MAP(CSplashWindow, CWnd)

  ON_WM_PAINT()

END_MESSAGE_MAP()

CSplashWindow::CSplashWindow()

  m_Bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_SPLASHWINDOW)); //Load Bitmap

  m_Bitmap.GetBitmap(&bmBitmap); //Get Bitmap Info

}

CSplashWindow::~CSplashWindow()

void CSplashWindow::CreateSplash()

  //Create Splash Window

  CWnd::CreateEx(0,

  AfxRegisterWndClass(

  0,

  AfxGetApp()->LoadStandardCursor(IDC_UPARROW)),

  NULL,

// "SplashWindow Sample",

  WS_POPUP,

  bmBitmap.bmWidth, //Bitmap Width = Splash Window Width

  bmBitmap.bmHeight, //Bitmap Height = Splash Window Height

  NULL);

void CSplashWindow::OnPaint()

  CPaintDC dc(this);

  CBrush brush;

  brush.CreateSolidBrush(RGB(64,64,255));

  dc.SelectObject(&brush);

  dc.Rectangle(0,0,bmBitmap.bmWidth,bmBitmap.bmHeight);

  MemDC.CreateCompatibleDC(NULL); //Create Memory DC

  Old_Bitmap = MemDC.SelectObject(&m_Bitmap); //Select DC

  int num = bmBitmap.bmWidth/40;

  dc.StretchBlt(0,0,bmBitmap.bmWidth,bmBitmap.bmHeight,&MemDC,0,0,bmBitmap.bmWidth,bmBitmap.bmHeight,SRCCOPY);

/* for(int k=0; k <40; k++) //百葉窗效果

  {

  for(int m=0; m <num+1; m++)

  dc.BitBlt(m*40+k,0,1,bmBitmap.bmHeight,&MemDC,m*40+k,0,SRCCOPY);

  }

  Sleep(1);

  }*/

  MemDC.SelectObject(Old_Bitmap); //Select Bitmap

在你App類的InitInstance函數中

C/C++ codeBOOL CXxxxApp::InitInstance()

  CWinApp::InitInstance();

  CSplashWindow *pSplashWindow = new CSplashWindow;

  pSplashWindow->CreateSplash();

  pSplashWindow->CenterWindow();

  pSplashWindow->ShowWindow(SW_SHOW);

  pSplashWindow->UpdateWindow();

  Sleep(3000); //Delay 3 Second

  pSplashWindow->DestroyWindow();

  delete pSplashWindow;

  ...

  return true;

============================================================

VC++ 6.0可以很友善的在工程中components and controls gallery添加Splash screen,來實作給程式插入啟動動畫,而VC++ 2008找不到插入components and controls gallery的地方,可以重寫SplashScreen類來實作,代碼如下:

====================================================================

//Splash.h頭檔案代碼

// CG: This file was added by the Splash Screen component.

#ifndef _SPLASH_SCRN_

#define _SPLASH_SCRN_

// Splash.h : header file

//

/////////////////////////////////////////////////////////////////////////////

//   Splash Screen class

class CSplashWnd : public CWnd

// Construction

protected:

CSplashWnd();

// Attributes:

CBitmap m_bitmap;

// Operations

static void EnableSplashScreen(BOOL bEnable = TRUE);

static void ShowSplashScreen(CWnd* pParentWnd = NULL);

static BOOL PreTranslateAppMessage(MSG* pMsg);

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CSplashWnd)

//}}AFX_VIRTUAL

// Implementation

~CSplashWnd();

virtual void PostNcDestroy();

BOOL Create(CWnd* pParentWnd = NULL);

void HideSplashScreen();

static BOOL c_bShowSplashWnd;

static CSplashWnd* c_pSplashWnd;

// Generated message map functions

//{{AFX_MSG(CSplashWnd)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnPaint();

afx_msg void OnTimer(UINT nIDEvent);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

#endif

//Splash.cpp 代碼檔案代碼

// Splash.cpp : implementation file

#include "stdafx.h" // e. g. stdafx.h

#include "resource.h" // e.g. resource.h

#include "SplashScreen.h" // e.g. splash.h

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char BASED_CODE THIS_FILE[] = __FILE__;

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

void CSplashWnd::EnableSplashScreen(BOOL bEnable /*= TRUE*/)

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))

   delete 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*/)

if (!m_bitmap.LoadBitmap(IDB_SPLASH))

BITMAP bm;

m_bitmap.GetBitmap(&bm);

return CreateEx(0,

   AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),

   NULL, WS_POPUP | WS_VISIBLE, 0, 0, bm.bmWidth, bm.bmHeight, pParentWnd->GetSafeHwnd(), NULL);

void CSplashWnd::HideSplashScreen()

// Destroy the window, and update the mainframe.

DestroyWindow();

AfxGetMainWnd()->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, 2000, NULL);

return 0;

void CSplashWnd::OnPaint()

CPaintDC dc(this);

CDC dcImage;

if (!dcImage.CreateCompatibleDC(&dc))

// Paint the image.

CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);

dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, SRCCOPY);

dcImage.SelectObject(pOldBitmap);

void CSplashWnd::OnTimer(UINT nIDEvent)

// Destroy the splash screen window.

HideSplashScreen();

插入以上兩個檔案即可~

繼續閱讀