65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL 启动窗口

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (11投票s)

2003年7月11日

viewsIcon

70407

downloadIcon

2005

在您的 WTL 应用程序启动时显示一个启动屏幕。

引言

你是否想在启动 WTL 应用程序时显示启动画面位图?  这就是方法 - 你只需要在你的项目中添加两行代码!  太棒了。

首先包含头文件

#include "splashwnd.h"

然后,在你的应用程序的 Run 函数中,简单地在创建主窗口之后创建一个新的 CSplashWnd 对象,并将你想要显示的图像的资源 ID 传递给它

new CSplashWnd(IDB_SPLASH);

就是这样!  几乎不可能更简单了。

你还可以向构造函数提供一个超时值和现有窗口的句柄(用于在启动画面居中显示时使用)。  例如,要将启动画面显示 3 秒,并使其居中在你的主窗口之上

if(wndMain.CreateEx() == NULL)
{
  ATLTRACE(_T("Main window creation failed!\n"));
  return 0;
} 
wndMain.ShowWindow(nCmdShow); 
new CSplashWnd(IDB_SPLASH, 3000, wndMain.m_hWnd);

请注意,你可以通过用鼠标左键/右键单击启动画面或按 ESC 键来取消启动画面。

CSplashWnd

这是源代码

#pragma once
 
#include <atlmisc.h>

 
class CSplashWnd :
 public CWindowImpl<CSplashWnd, CWindow, 
    CWinTraits<WS_POPUP|WS_VISIBLE, WS_EX_TOOLWINDOW> >
{
private:
 enum
 {
  DEF_TIMER_ID  = 1001,
  DEF_TIMER_ELAPSE = 2500,
 };
private:
 CBitmap m_bmp;
 int m_nTimeout;
 HWND m_hParent;
public:
 CSplashWnd(UINT nBitmapID, int nTimeout = DEF_TIMER_ELAPSE, 
    HWND hParent = NULL)
  : m_nTimeout(nTimeout)
  , m_hParent(hParent)
 {
  // Load the bitmap

  if (!m_bmp.LoadBitmap(nBitmapID))
  {
   ATLTRACE(_T("Failed to load spash bitmap\n"));
   return;
  }
  // Get the bitmap size

  CSize size;
  if (!m_bmp.GetSize(size))
  {
   ATLTRACE(_T("Failed to get spash bitmap size\n"));
   return;
  }
  // Create the window rect (we will centre the window later)

  CRect rect(0, 0, size.cx, size.cy);
  // Create the window

  if (!Create(NULL, rect))
  {
   ATLTRACE(_T("Failed to create splash window\n"));
   return;
  }
  UpdateWindow();
 }

 /// Called when the window is destroyed

 virtual void OnFinalMessage(HWND /*hWnd*/)
 {
  delete this;
 }

 BEGIN_MSG_MAP(CSplashWnd)
  MESSAGE_HANDLER(WM_CREATE, OnCreate)
  MESSAGE_HANDLER(WM_PAINT, OnPaint)
  MESSAGE_HANDLER(WM_TIMER, OnTimer)
  MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
  MESSAGE_HANDLER(WM_LBUTTONDOWN, OnButtonDown)
  MESSAGE_HANDLER(WM_RBUTTONDOWN, OnButtonDown)
  MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
 END_MSG_MAP()
 
 LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, 
    LPARAM /*lParam*/, BOOL& /*bHandled*/)
 {
  CenterWindow(m_hParent);
  // Set the timer

  SetTimer(DEF_TIMER_ID, m_nTimeout);
  return 0;
 }

 LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, 
    LPARAM /*lParam*/, BOOL& /*bHandled*/)
 {
  // Draw the bmp

  CPaintDC dc(m_hWnd);
  
  CDC dcImage;
  if (dcImage.CreateCompatibleDC(dc.m_hDC))
  {
   CSize size;
   if (m_bmp.GetSize(size))
   {
    HBITMAP hBmpOld = dcImage.SelectBitmap(m_bmp);
    dc.BitBlt(0, 0, size.cx, size.cy, dcImage, 0, 0, SRCCOPY);
    dcImage.SelectBitmap(hBmpOld);
   }
  }

  return 0;
 }

 LRESULT OnTimer(UINT /*uMsg*/, WPARAM /*wParam*/, 
    LPARAM /*lParam*/, BOOL& /*bHandled*/)
 {
  KillTimer(DEF_TIMER_ID);
  PostMessage(WM_CLOSE);
  return 0;
 }
 
 LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, 
    LPARAM /*lParam*/, BOOL& /*bHandled*/)
 {
  // No need to paint a background

  return TRUE;
 }

 LRESULT OnButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, 
    LPARAM /*lParam*/, BOOL& /*bHandled*/)
 {
  PostMessage(WM_CLOSE);
  return 0;
 }

 

 LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, 
    LPARAM /*lParam*/, BOOL& /*bHandled*/)
 {
  if (wParam == VK_ESCAPE)
   PostMessage(WM_CLOSE);
  return 0;
 }
};
© . All rights reserved.