山脉户外是正品吗: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
再编译,一切通过了。运行一下程序,果然有了淡入淡出效果的启动画面。
武汉大学,遥感信息工程学院 屈伟军
好久没有写过技术文章了,就写一下淡入淡出启动画面的制作吧。在 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
再编译,一切通过了。运行一下程序,果然有了淡入淡出效果的启动画面。
关于FLASH中图片淡入淡出的效果如何制作?
字幕的[这种淡入淡出]效果怎么制作?2
怎么去掉右击菜单中淡入淡出的效果
在用html制作淡入淡出文本效果时,用ie6.0所提示的错误怎么修改?
怎样在FlashMX里制作图片交换时的淡入淡出效果?
关于xp的淡入淡出问题
何为声音的淡入淡出??
播放音乐时的淡入淡出
什么叫视频的淡入淡出啊?
VB实现窗体的淡入淡出效果
aigo MP3 的淡入淡出是什么意思?
Flash MX 2004中怎么设置文字的淡入淡出呀?
FLASH制作中的图片淡入淡出,如何处理?
BCB中怎么实现文字颜色渐变或者淡入淡出
Windows 98 & 淡入淡出
什么是淡入淡出效果?
FLASH文字淡入淡出
文字淡入淡出
表格淡入淡出
什么是淡入淡出呀?
“淡入”“淡出”是什么意思?
淡入、 淡出是什么意思
怎样在Premiere Pro 1.5中制做出音频的交叉淡入淡出的效果.谢谢各位啦!
Winamp能声音淡入淡出的是哪个版本