闪屏,就是在主对话框弹出之前先在屏幕上显示一张图片,或一小段动画以介绍产品的信息等。
初一看,在屏幕上显示一张图片或动画是不太容易的事情,但我们仔细一想便会发现,其实是挺简单的。
我们应该这样来考虑,在屏幕上显示一个对话框估计只要学过MFC的人都会做,我们可以将对话框的边框和按钮都去掉,只剩下一个面板,而且这个面板上只有一张图片,这个也不算太难(别忘了设置对话框的visible属性)。然后再用classWizzard为这个对话框新建一个类,比如叫CMySplash吧。好,至此准备工作已经做完。下面我们就将这个伪图片做成闪屏。
1.要想让这张图片在主对话框出现之前出现,首先我们得知道主对话框是在哪里弹出的。
观察BOOL CMyClassApp::InitInstance()中的代码,我们不难发现有这样一段:
CMyClassDlg 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
}
很明显,这段代码的意思是弹出主对话框。所以我们的闪屏对话框的出现和消息代码应该在它之前出现。
2.建立一个非模态对话框,来显示我们的闪屏对话框。为什么要建立一个非模态对话框呢?因为非模态对话框不会阻断我们代码的运行,这样我们就可以通过Sleep函数来轻松控制闪屏显示的时间了。(当然可能模态对话框也可以)
在上面的那段代码之前加上如下代码(紧挨着加就行了):
CMySplash spDlg;
spDlg.Create(IDD_DIALOG_MySplash);
spDlg.ShowWindow(SW_SHOW);
Sleep(2000);
spDlg.DestroyWindow();
当然你也可以用指针来实现,但是要记住用 new产生的指针在不用时要销毁掉。
CMySplash spDlg;
spDlg.Create(IDD_DIALOG_MySplash);
spDlg.ShowWindow(SW_SHOW);
Sleep(2000);
spDlg.DestroyWindow();
CMySplash* spDlg;
spDlg=new CMySplash;
spDlg->Create(IDD_DIALOG_MySplash);//通过Create函数将对话框ID与对象相关联
spDlg->ShowWindow(SW_SHOW);//显示窗口
Sleep(2000);//停留2秒
spDlg->DestroyWindow();//销毁窗口
下面在响应WM_NCDESTROY的函数OnNcDestroy()中来销毁指针
void CMySplash::OnNcDestroy()
{
CDialog::OnNcDestroy();
// TODO: Add your message handler code here
/ delete this;
}
至此再运行你的程序看一下,是不是在你主对话框出现之前弹出了闪屏?当然你也可以在闪屏对话框中响应计时器消息来制作动态的闪屏,这里就不再举例了。