昨天晚上没事看了孙鑫VC视频的第9课,一边和老婆发短信,一边听着视频,感觉优哉游哉的,呵呵,无语的是最后他又用VC组件了,好吧,我承认我用的VS2008,而从VS2005开始就不支持Splash screen这样地基于源码地组件了,上一个右键菜单组件我就忍了,你还来……
不过本着不服输的精神,就手动整一个吧,还有就是可能贴出来的代码排版有问题,事先声明不是我的错,这个博客系统的问题,有图为证,看看我那边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的博客:
博客园http://www.cnblogs.com/pang123hui/
http://blog.csdn.net/pang123hui/