本文不同于VC下使用ScrnSave.lib进行屏保制作的方式,
而是在VS下以其内在原理,从无到有进行一个简单的WIN32屏保开发,
只要你拥有一些简单的WIN32程序编写的经验,便可以很轻松的明白并编写出此类屏保。
首先,要实现一个屏保,我们需要实现三件事。
-
操作系统自动运行程序
-
全屏幕的窗口
-
用户输入即退出
操作系统自动运行程序:
这很幸运,因为只要将用户程序的后缀名改为.scr, 将其放到正确的系统目录下,便可以成为
真正的屏幕保护程序,在空闲时自动得到操作系统的调用,而不用我们花大量时间编写代码。
全屏幕的窗口:
这个也很简单,只要我们将窗口创建为全屏显示,那么自然也没有太大问题了。
你可以这样做:
hwnd = CreateWindow(L"BeyondScrnSaver", NULL, //注意这里初始化HWND_DESKTOP,
WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 0, //因为在窗口上播放视频,窗口显示太快会看到先显示背景,所以我先将其大小调整为0
0, HWND_DESKTOP, NULL, hInstance, NULL);
用户输入即退出:
只要在消息窗口过程中进行鼠标移动,点击,以及键盘输入事件的处理,便可以实现该退出过程。
好了,讲了这么多,现在我们从实现一个屏幕保护程序的窗口框架开始吧....
/*---------------------------------------------------------------------------------
【Cpp文件】:ScreenMain.cpp Created by Beyond Ray,2014年4月
(描述):使用天下叁CG《墨龙纪》制作成简单的屏保
-----------------------------------------------------------------------------------*/
//------------------------【头文件】--------------------------------
#include
#include //使用swprintf_s函数所需的头文件
#include "resource.h" //资源文件(只用于图标)
//------------------------【全局函数声明】--------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); //主窗口过程函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWND hwndFrameWnd = 0;
HWND hwnd = 0;
RECT rect;
//---------------------------【设计一个窗口类】------------------------------
WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定义一个窗口类,并初始化
wndClass.cbSize = sizeof(WNDCLASSEX); //设置结构体的字节数大小
wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口的样式
wndClass.lpfnWndProc = WndProc; //设置指向窗口过程函数的指针
wndClass.cbClsExtra = 0; //窗口类的附加内存,取0就可以了
wndClass.cbWndExtra = 0; //窗口的附加内存,依然取0就行了
wndClass.hInstance = hInstance; //指定包含窗口过程的程序的实例句柄。
wndClass.hIcon = (HICON)LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); //本地加载自定义ico图标
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //指定窗口类的光标句柄。
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //指定一个白色画刷句柄
wndClass.lpszMenuName = NULL; //用一个以空终止的字符串,指定菜单资源的名字。
wndClass.lpszClassName = L"BeyondScrnSaver"; //用一个以空终止的字符串,指定窗口类的名字。
//----------------------------【注册一个窗口类】------------------------------
if (!RegisterClassEx(&wndClass))
return -1;
//-----------------------------【创建一个窗口】-------------------------------
hwnd = CreateWindow(L"BeyondScrnSaver", NULL, //注意这里初始化HWND_DESKTOP,并且在最初大小为0,
WS_POPUP | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 0, //以防止视频还没播放前看到白屏
0, HWND_DESKTOP, NULL, hInstance, NULL);
//窗口更新显示
MoveWindow(hwnd, 0, 0, GetSystemMetrics(SM

本文介绍如何在VS环境下,不依赖ScrnSave.lib从零开始开发一个简单的WIN32屏保程序,重点讲解如何实现操作系统自动运行、全屏显示以及用户输入即退出的功能。通过创建全屏窗口,监听用户输入事件,结合mciSendString函数关闭视频,完成屏保的基本框架。
最低0.47元/天 解锁文章
586





