昨天晚上没事看了孙鑫VC视频的第9课,一边和老婆发短信,一边听着视频,感觉优哉游哉的,呵呵,无语的是最后他又用VC组件了,好吧,我承认我用的VS2008,而从VS2005开始就不支持Splash screen这样地基于源码地组件了,上一个右键菜单组件我就忍了,你还来……
不过本着不服输的精神,就手动整一个吧,还有就是可能贴出来的代码排版有问题,事先声明不是我的错,这个CSDN博客系统的问题,有图为证,看看我那边test日志就知道了
新建一个单文档应用程序,从CWnd类派生一个类就叫CSplashWnd吧,如图。
添加两个保护属性的成员变量,如下所示,感觉有时用向导反而不爽,自己敲吧。
- // 初始画面位图 CBitmap m_bitmap;
- //指向初始画面窗口的指针 static CSplashWnd* c_pSplashWnd;
不祥写了,过程看代码吧,有注释。
- // CSplashWnd 消息处理程序
- //向CSplashWnd类中加入一个静态公有成员函数ShowSplashScreen
- //该函数将被主框架窗口调用 void CSplashWnd::ShowSplashScreen(CWnd *pParentWnd)
- {
- //此函数传递的参数是主框架窗口
- if(c_pSplashWnd != NULL)
- {
- return;
- }
- //创建初始画面窗口
- c_pSplashWnd = new CSplashWnd;
- if(!c_pSplashWnd->Create(pParentWnd))
- {
- delete c_pSplashWnd;
- }
- //显示初始画面窗口
- else
- {
- c_pSplashWnd->UpdateWindow();
- }
- }
- //编辑ShowSplashScreen函数中调用的Create函数(保护成员函数)
- BOOL CSplashWnd::Create(CWnd * pParentWnd)
- {
- //载入位图
- if(!m_bitmap.LoadBitmap(IDB_BITMAP1))
- {
- return FALSE;
- }
- 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);
- return false;
- }
- //CreateEx将调用OnCreate函数进行窗口的初始化,重载此函数
- int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CWnd::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: 在此添加您专用的创建代码
- CenterWindow();
- //时间控制
- SetTimer(1, 1000, NULL);
- return 0;
- }
- //显示窗口时发送WM_PAINT消息响应void CSplashWnd::OnPaint()
- {
- CPaintDC dc(this);
- // device context for painting
- // TODO: 在此处添加消息处理程序代码
- // 不为绘图消息调用 CWnd::OnPaint()
- CDC dcImage;
- if(!dcImage.CreateCompatibleDC(&dc))
- {
- return;
- }
- BITMAP bm;
- m_bitmap.GetBitmap(&bm);
- 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_PTR nIDEvent)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- //销毁初始画面窗口
- DestroyWindow();
- //刷新主框架窗口
- AfxGetMainWnd()->UpdateWindow();
- //CWnd::OnTimer(nIDEvent);}
- //为防止内存溢出,窗口销毁后要释放CSplashWnd对象
- //重载虚拟函数PostNcDestroy,此函数在窗口销毁后调用,已达到此目的void CSplashWnd::PostNcDestroy()
- {
- // TODO: 在此添加专用代码和/或调用基类
- delete this;
- //CWnd::PostNcDestroy();}
还有不要忘了新建或导入一个ID号为IDB_BITMAP1的位图。
这是我找的位图,还好,还好。
当然大家会有这样一个经历,就是一般这种功能的软件都有一种功能,就是当图片显示的时候,往往用户是不想看到这个画面的,那么点击鼠标或敲击键盘,应该可以使这个画面立即跳过,而不再等到定时器到时再去关闭。
在CWinApp重写转发处理函数PreTranslateMessage(),调用已在调度消息之前对消息进行筛选。
- BOOL ClessonApp::PreTranslateMessage(MSG* pMsg)
- {
- // TODO: 在此添加专用代码和/或调用基类
- if (CSplashWnd::PreTranslateAppMessage(pMsg))
- {
- return TRUE;
- }
- return CWinApp::PreTranslateMessage(pMsg);
- }
不要忘了在头部添加CSplashWnd的头文件,Ok了,这样功能就算完善了。
----------------------------------------------------------------------------------
转载我博客文章郑重声明:技术性网站著名原创作者即可转载,商业性网站必须经过我的同意才能转载,否则追究责任——
pang123hui的博客: