使用 MFC 的 C++ 闪屏类






4.74/5 (9投票s)
一个 MFC C++ 类,用于根据位图和版本字符串资源生成启动屏幕和关于框。
引言
每个应用程序都需要一个“关于框”,有些在加载时需要一个“启动屏幕”。我创建了 CSplashWindow 类来处理这两者。大多数开发人员使用自动生成的单调乏味的“关于对话框”。作为一名顾问,我致力于创造一个看起来不错、没有错误且为客户量身定制的专业产品。CSplashWindow 通过拥有视觉吸引力的客户端图形以及从版本字符串提取的所有信息来满足这些要求。版本号不匹配和忘记填写版本字符串的问题已成为过去。我将这个类用于从小型对话框小程序到需要几分钟才能加载和初始化的复杂应用程序的程序。
该类包含两个文件:SplashWindow.h 和 SplashWindow.cpp。该类需要 MFC。我写了另一篇文章《无 MFC 或 .NET 的 C++ 启动屏幕类》,其中不使用 MFC。
该类从资源中的位图和版本字符串获取要在启动屏幕上显示的所有信息。因此,您不必每次版本更改时都修改启动屏幕。
启动屏幕在单击、按下按键或经过指定时间后消失。

Using the Code
- 包含 SplashWindow.h 和 SplashWindow.cpp。
- 向资源添加版本字符串。
- 向资源添加 IDB_SPLASH位图。
- 将 version.lib 添加到链接库。
ShowSplashScreen(HWND pParentWnd, LPCTSTR statusMessage, int millisecondsToDisplay) 可以有零到三个参数。
- pParentWnd- 启动屏幕的父窗口
- statusMessage- 要在启动屏幕状态区域显示的字符串
- millisecondsToDisplay- 隐藏启动屏幕之前的毫秒数
要在初始化期间显示启动屏幕,请添加 CSplashWindow::ShowSplashScreen();
#include SplashWindow.h
BOOL CSplashMfcDialogApp::InitInstance()
{
    AfxEnableControlContainer();
    CSplashWindow::ShowSplashScreen( NULL, NULL, 3000);
    // Standard initialization
    CSplashMfcDialogDlg dlg;
    m_pMainWnd = &dlg;
    int nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with OK
    }
    else if (nResponse == IDCANCEL)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with Cancel
    }
    return FALSE;
}
必须捕获鼠标单击和键盘按下才能关闭启动屏幕。我通过使用类向导将 PreTranslateMessage 消息添加到主应用程序类来实现此目的。插入 CSplashWindow::PreTranslateAppMessage(pMsg) 以允许类检测关闭启动窗口的消息。
BOOL CSplashMfcDialogApp::PreTranslateMessage(MSG* pMsg) 
{
    if (CSplashWindow::PreTranslateAppMessage(pMsg))
        return TRUE;
  
    return CWinApp::PreTranslateMessage(pMsg);
}
要显示关于框,请将 dlgAbout.DoModal() 替换为 CSplashWindow::ShowSplashScreen()
#include SplashWindow.h
void CSplashMfcDialogDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        // replace About Dialog with Splash window
        CSplashWindow::ShowSplashScreen( this, "http://applehome.com/", 10000);
        //  CAboutDlg dlgAbout;
        //  dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}
幕后
作为一名顾问,我会为每个客户创建一个专门的位图。我通常将公司徽标和应用程序图标放在 IDB_SPLASH 位图中。根据您的艺术才能,您可以制作一个非常专业的启动屏幕。版本字符串写在位图的顶部。
字符串分为 3 组:产品名称、正文和状态。正文包含一个或多个公司名称、版本、版权和注释字符串。我倾向于让产品名称字体更大,而正文的多行字体较小。我仅在应用程序加载时使用状态。
每组都有 static 变量,用于指定该组字符串的绘制方式
- m_xxxVerticalOffset- 位图顶部和第一个字符串之间的空白
- m_xxxVerticalHeight- 字符串组的最大高度
- m_xxxLeftMargin- 从左侧到字符串位置的距离
- m_xxxRightMargin- 从右侧到字符串的位置的距离
- m_xxxFontName- 字符串的字体名称
- m_xxxPointSize- 用于字符串的点大小,(-1,-1) ==> 计算点大小
- m_xxxTextColor- 用于字符串的颜色
正文可以包含 0 到 4 个字符串。设置 static 显示变量
- m_displayCompanyName- 如果显示公司名称,则为- true
- m_displayVersion- 如果显示版本,则为- true
- m_displayCopyright- 如果显示版权,则为- true
- m_displayComments- 如果显示注释,则为- true
当调用 CSplashScreen::ShowSplashScreen() 时,会实例化 CSplashScreen 类。当超时、按下按键或单击鼠标时,它会被删除。
关注点
我很久以前就写了这个类,并且很少修改它。最近我创建了一个非常轻量级的应用程序,它不使用 MFC,而我想要启动屏幕。我咬紧牙关,重写了不使用 MFC 的类,无 MFC 或 .NET 的 C++ 启动屏幕类。看到使用 MFC 时代码如何变化很有趣。下载源代码,您可以检查如何在不使用 MFC 的情况下处理相同的功能。
历史
- 发布日期:2009 年 4 月 23 日


