WTLVisual C++ 7.1Visual Studio 6Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XP中级开发Visual StudioWindowsC++
WTL 启动窗口






4.06/5 (11投票s)
2003年7月11日

70407

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; } };