山脉户外是正品吗:VC6.0 中淡入淡出启动画面的制作

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 08:56:53
VC6.0 中淡入淡出启动画面的制作 
武汉大学,遥感信息工程学院  屈伟军
好久没有写过技术文章了,就写一下淡入淡出启动画面的制作吧。在 VC6.0 中,有一个简单的
方法可以加入启动画面,那就是使用“组件与控件” 。不过这种方法只在 VC6.0 中可以使用,而且在
Windows  7 操作系统中不支持此操作,通用性也不好,因而在这里不予介绍。下面讲述如何来设计
自己的启动窗口类。 
首先,新建一个 MFC 的工程,然后选择菜单 Insert ‐> New Class…,弹出新建类对话框,类型选
择 MFC  Class,基类选择 generic  CWnd,名称就叫做 CSplashWnd 吧。点击确定以后工程中就多出了
一个类 CSplashWnd,里面除了构造函数和析构函数之外什么都没有,需要我们自己来添加功能。 
使用启动画面要自己准备一幅位图,图 1 所示的是 Microsoft Office Word  2007 的启动画面。当
我们准备好位图之后,就可以在资源视图中点击鼠标右键(注意不要点在空白处,在任何一个文件
夹上都可以) ,选择 Import…,导入该位图,ID 就命名为 IDB_SPLASH。 
 
图1   Microsoft Office Word 2007  启动画面 
打开类向导,为 CSplashWnd 类添加四个消息处理函数 WM_CREATE、WM_CLOSE、WM_TIMER
和 WM_ERASEBKGND。全部添加好了之后,就可以开始实现我们的功能了。 
(1)在 CSplashWnd 类的构造函数中添加下面的代码: 
 LPCTSTR lpszWndClass= AfxRegisterWndClass(NULL);  // 注册窗口类
 CreateEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, lpszWndClass, NULL,
WS_POPUP, 
  CW_USEDEFAULT,  CW_USEDEFAULT,  SPLASH_WIDTH,  SPLASH_HEIGHT,  NULL,
NULL, NULL);  // 创建窗口
其中 SPLASH_WIDTH和 SPLASH_HEIGHT 分别为位图的宽度和高度,需要事先定义。 
(2)在 OnCreate 函数中添加如下代码: 
 CenterWindow();  // 启动画面窗口居中
 SetTimer(1, 3000, NULL);  // 启动画面显示时间为 3秒
 AnimateWindow(GetSafeHwnd(), 1200, AW_BLEND);  // 窗口渐显,实现淡入
效果,时间 1.2 秒
(3)在 OnClose 函数中添加如下代码:  AnimateWindow(GetSafeHwnd(), 800, AW_BLEND | AW_HIDE);  // 窗口渐隐,
实现淡出效果,时间 0.8 秒
(4)在 OnTimer 函数中添加如下代码: 
 KillTimer(1);  // 销毁定时器
 PostMessage(WM_CLOSE);  // 关闭启动画面
(5)在 OnEraseBkgnd 函数中添加如下代码: 
 HINSTANCE hApp = ::GetModuleHandle(NULL);  // 得到应用程序的模块句柄
 HBITMAP hbmp = ::LoadBitmap(hApp, MAKEINTRESOURCE(IDB_SPLASH));  //
加载程序中的位图资源
 HDC hmdc = ::CreateCompatibleDC(pDC->GetSafeHdc());  // 创建兼容 DC
作为内存 DC
 HBITMAP hbmpOld = (HBITMAP) ::SelectObject(hmdc, hbmp);  //将位图选
入内存 DC
 ::BitBlt(pDC->GetSafeHdc(),  0,  0,  SPLASH_WIDTH,  SPLASH_HEIGHT,  hmdc,
0, 0, SRCCOPY);  // 将内存 DC 中的内容拷贝到设备 DC以显示
 // 清理,防止内存泄漏
 ::SelectObject(hmdc, hbmpOld);
 ::DeleteObject(hbmp);
 ::DeleteDC(hmdc);
其中 IDB_SPLASH 为位图资源的 ID,SPLASH_WIDTH 和 SPLASH_HEIGHT 即为事先定义好的位图
的宽度和高度。 
到现在为止,启动窗口类就设计完成了。编译一下程序,会发现有三个错误。 
error C2065: 'AnimateWindow' : undeclared identifier 
error C2065: 'AW_BLEND' : undeclared identifier 
error C2065: 'AW_HIDE' : undeclared identifier 
我们先不管它,接着在应用程序(App)类的 InitInstance 函数的开头添加如下代码: 
 CSplashWnd* pSplash = new CSplashWnd;  // 创建启动画面窗口
 pSplash->ShowWindow(m_nCmdShow);  // 显示启动画面窗口
 Sleep(2500);  // 主窗口延时 2.5 秒
现在我们来解决上面提到的三个错误。为什么会出现上面的错误呢?经过查证,是由于版本定
义的问题。到 MSDN 上查阅 AnimateWindow 函数,上面有这样一段话: 
QuickInfo 
Windows NT: Requires version 5.0 or later. 
Windows: Requires Windows 98 or later. 
Windows CE: Unsupported. 
Header: Declared in winuser.h. 
Import Library: Use user32.lib. 
使用这个函数需要Windows NT 5.0及以上或者是Windows 98及以上版本。 去VC6.0的安装目录,找到 winuser.h,搜索 AnimateWindow,发现这个函数也对 Windows 的版本进行了控制: 
 #if(WINVER >= 0x0500)
 WINUSERAPI
 BOOL
 WINAPI
 AnimateWindow(
     HWND hWnd,
     DWORD dwTime,
     DWORD dwFlags);
 #endif /* WINVER >= 0x0500 */
上面对 WINVER(即 Windows 的版本)的定义作了判断,只有是 5.0 及以上版本才能使用这个
函数。但是现在使用的 Windows的版本肯定远远超过了这个版本,应该是没有问题的,这是怎么回
事呢?那么,打开 WINDOWS.H 去看看吧。果然,在这个文件的开头前几行就霍然写着: 
 #ifndef WINVER
 #define WINVER 0x0400
WINDOWS.H 里面定义的 Windows 的版本竟然是 4.0 的。想想 VC6.0 是 98 年出来的,也就不觉
得奇怪了。那么在 StdAfx.h 中对 WINVER 进行重新定义,看看结果怎么样: 
 #undef WINVER
 #define WINVER 0X0500
再编译,一切通过了。运行一下程序,果然有了淡入淡出效果的启动画面。