VS2008手动实现程序初始画面

    技术2024-07-05  164

          昨天晚上没事看了孙鑫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/

         

    最新回复(0)