并于屏幕保护程序
Microsoft Windows控制面板中的显示程序让用户从一个列表中选择屏幕保护程序,指定屏幕保护程序应该在系统空闲多久之后启动,配置,以及预览屏幕保护程序。屏幕保护程序可以由Windows自动启动或者由用户通过控制面板来启动。
一旦选择了屏幕保护程序,Windows便监视键盘和鼠标动作并在其静止一段时间后启动屏保。然而,Windows在下列任意一种情况下不会启动屏保:
活动的应用程序不是一个基于Windows的程序。
一个computer-based training(CBT)窗口在显示。
活动的应用程序收到一个wParam参数为SC_SCREENSAVE的WM_SYSCOMMAND消息,但是它没有把消息传给DefWindowProc函数。
屏保程序包含一些特定的导出函数,资源定义,和变量声明。屏保程序包含main函数和其它对屏保程序必要的启动代码。当一个屏保程序启动时,该屏保程序库中的启动代码会创建一个全屏窗口。这一窗口的窗口类声明如下:
WNDCLASS cls;
cls.hCursor = NULL;
cls.hIcon = LoadIcon(hInst, MAKEINTATOM(ID_APP));
cls.lpszMenuName = NULL;
cls.lpszClassName = "WindowsScreenSaverClass";
cls.hbrBackground = GetStockObject(BLACK_BRUSH);
cls.hInstance = hInst;
cls.style = CS_VREDRAW | CS_HREDRAW |
CS_SAVEBITS | CS_DBLCLKS;
cls.lpfnWndProc = (WNDPROC) ScreenSaverProc;
cls.cbWndExtra = 0;
cls.cbClsExtra = 0;
为了创建一个屏保程序,多数开发者会创建一个包含三个必需函数的源码模块并将它们与屏保程序库链接。屏保模块仅负责自身的配置及提供可视化效果。
屏保程序模块所需的三个函数中的一个是ScreenSaverProc。这个函数处理特定的消息并将任何不处理的消息传回到屏保程序库。下面是ScreenSaverProc处理的一些典型消息。
消息
含义
WM_CREATE
从Regedit.ini文件获取初始化数据。为屏保窗口设置一个窗口定时器。执行其它必要操作。
WM_ERASEBKGND
擦除屏保窗口,为紧接着的绘制操作作准备。
WM_TIMER
执行绘制操作。
WM_DESTROY
销毁应用程序处理WM_CREATE消息时创建的定时器。执行其它必要的清理。
ScreenSaverProc通过调用DefScreenSaverProc函数将不处理的消息传给屏保程序库。下表说明了这个函数如何处理各种消息。
消息
动作
WM_SETCURSOR
将鼠标指针设为空指针,以从屏幕上移除。
WM_PAINT
绘制窗口背景。
WM_LBUTTONDOWN
终止屏保程序。
WM_MBUTTONDOWN
终止屏保程序。
WM_RBUTTONDOWN
终止屏保程序。
WM_KEYDOWN
终止屏保程序。
WM_MOUSEMOVE
终止屏保程序。
WM_ACTIVATE
如果wParam被设置为FALSE则终止屏保程序。
屏保程序模块必需的第二个函数是ScreenSaverConfigureDialog。这个函数显示一个对话框以允许用户对屏保程序进行配置(应用程序必须提供相应的对话框模板)。Windows在用户点击控制面板中屏保程序对话框中的设置按钮时显示这个配置对话框。
屏保程序模块必需的第三个函数是函数是RegisterDialogClasses。这个函数必须被所有的屏保程序调用。然而,配置对话框中不需要特殊窗口或者自定义控件的程序可以简单地返回TRUE。需要特殊窗口或者自定义控件的程序应该用这个函数来注册相应的窗口类。
除了创建一个支持刚才所描述的这三个函数的模块之外,屏保程序还应该提供一个图标。这个图标只在屏保程序作为一个独立的程序运行时才可见。(为了通过控制面板来运行,屏保程序必须以.scr作为文件的扩展名。)图标必须在屏保程序的资源文件中通过ID_APP来标识,该值的定义在Scrnsave.h头文件中。
最后一个必要条件是一个屏保程序描述字符串。屏保程序的资源文件中必须包含一个被控制面板用来显示作为其名字的字符串。描述字符串必须是其资源文件的字符串表中的第一个字符串(用常数1来标识)。
使用屏保程序函数
本节通过从屏保程序中截取下来的示例代码来说明如下任务:
创建一个屏保程序
安装新屏保程序
为屏保程序配置对话框添加帮助
创建一个屏保程序
该程序以1到10秒范围内的时间间隔以这四中颜色中的一个来重绘屏幕:白色,淡灰,深灰,和黑色。程序在每收到一个WM_TIMER消息时绘制窗口。用户可以通过调节程序的配置对话框中的滚动条来调整这个消息发送的间隔时间。
屏保程序库
静态屏保程序函数包含在屏保程序库中。该库有两个可用版本,Scrnsave.lib和Scrnsavw.lib。你必须将你的工程链接到其中的一个。Scrnsave.lib用于使用ANSI字符集的屏保程序,Scrnsavw.lib则用于使用UNICODE字符集的程序。用Scrnsavw.lib链接的屏保程序只能在支持UNICODE的Windows平台上运行,而用Scrnsave.lib链接的屏保程序则可以在任何Windows平台上运行。
对配置对话框的支持
一个有信念者所开发出的力量,大于99个只有兴趣者。