用C Builder研发Windows下的屏保

2008-02-23 05:25:23来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

摘要:本文通过一个具体的程式演示了Windows下的屏幕保护程式的实现过程。
一. 引言
Windows下的屏幕保护程式是个基于命令行(Command Line)的应用程式。当屏保程式被调用时操作系统就用具体的命令行执行该程式。本文组织和处理了任何的命令行,包括“/p”,“/s”,“/c”,“/a”,其中“/p”表示让屏保在预览窗口中显示;“/s”表示真正运行屏保;“/c”表示调用配置对话框;而“/a”表示调用密码配置对话框(WinNT中无效)。本程式尽可能简单地实现一个全功能的屏保,运行Windows的屏保配置程式时您既能够修改密码(WinNT中无效)又能够配置图片显示的频率并把频率数值保存到注册表里。当屏保运行时图片以您配置的频率改变显示位置。笔者还留了个作业给读者,请看图1中的选择图片文档夹这个项目,按下浏览按钮能够配置图片的路径,笔者已实现了浏览按钮的功能并
把得到的路径也保存到注册表中,并让屏保启动时读picdir的值,picdir等于"no"时的代码笔者已实现了,picdir不等于"no"时的代码由读者实现。也就是让读者实现一个能把picdir目录里的图片轮流显示的屏保程式。

二. 实现方法
首先介绍几个API函数。
WinMain函数:
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例句柄
HINSTANCE hPrevInstance, // 前一个实例句柄
LPSTR lpCmdLine, // 指向命令行参数的指针(本程式要利用的参数)
int nCmdShow // 窗口的状态
);
GetWindowLong函数:得到指定窗口信息的函数
LONG GetWindowLong(
HWND hWnd, //窗/口句柄
int nIndex //指/定返回的信息
);
SetWindowLong函数:改变窗口属性
LONG SetWindowLong(
HWND hWnd, //窗/口句柄
int nIndex, // 指定要设定的值的信息
LONG dwNewLong // 新值
);
SetParent函数:改变指定窗口的父窗口
HWND SetParent(
HWND hWndChild, //要/改变父窗体的窗口句柄
HWND hWndNewParent //新/的父窗体的句柄
);
GetClientRect函数:得到窗口的客户区
BOOL GetClientRect(
HWND hWnd, // 窗口句柄
LPRECT lpRect //RECT/结构的地址
);
SetWindowPos函数:改变窗口的大小,位置,顶级窗口等
BOOL SetWindowPos(
HWND hWnd, // 窗口句柄
HWND hWndInsertAfter, // 布置窗口顺序的句柄(Z order)
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // 窗口位置等标记
);
SystemParametersInfo函数:访问或配置系统级的参数
BOOL SystemParametersInfo(
UINT uiAction, // 指定要获取或配置的系统参数
UINT uiParam, // depends on action to be taken
PVOID pvParam, // depends on action to be taken
UINT fWinIni // 用户配置文档是否改变标记
);
ShowCursor函数:显示或隐藏光标
int ShowCursor(
BOOL bShow // 鼠标可见度标记
);
GetVersion函数:获取系统的版本信息
DWORD GetVersion(VOID)

以上API函数的具体信息能够查找有关MSSDK文档。了解了基本函数后笔者简述一下实现方法。
1. 新建一工程,增加两个窗体,将三个窗体分别取名为MainForm,FrmConfig,FrmControl。在MainForm和FrmControl窗体上各添加一个Timer控件和TImage控件,把两窗体的BorderStyle设为bsNone,背景色设为黑色。在两个窗体的TImage上各加一张图片,FrmControl大小设为:高130像素,宽160像素,Timage的Stretch属性设为真值。FrmConfig的样式如图1。
2. 保存工程文档为screensaver.cpp,其他单元分别存为Unitmain.cpp,
Unitcontrol.cpp,Unitconfig.cpp。
3. 编写代码,具体代码见第三部分的源程式。
4. 编译成可执行文档,并把文档扩展名改为scr。
5. 最后把屏保程式拷贝到windows目录下就能够测试了。假如一切正常的话您将会看
到图片在屏幕上以随机的位置显示。

三. 源代码
以下是本程式的任何的源代码,其中screensaver.cpp, Unitmain.cpp是核心代码。
/*{*******************************}*/
/*{***** screensaver.cpp ****}*/
/*{*******************************}*/
//---------------------------------------------------------------------------/
#include
#pragma hdrstop
USERES("screensaver.res");
USEFORM("Unitmain.cpp", Frmmain);
USEFORM("Unitconfig.cpp", FrmConfig);
USEFORM("Unitcontrol.cpp", FrmControl);
//---------------------------------------------------------------------------/
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR p, int)//“p"是指向命令行参数的指针
{ String StartType;
AnsiString Command=p,temp;
HWND CPWindow =NULL;
if(Command=="")
StartType = "/c";
else
StartType=Command.SubString(1,2);//获取命令行的前两个参数
try
{
Application->Initialize();
if(StartType=="/c")//启动配置窗口
Application->CreateForm(__classid(TFrmConfig), &FrmConfig);
else if(StartType=="/s")启动屏保
Application->CreateForm(__classid(TFrmmain), &Frmmain);
else if(StartType=="/p")//预览
{
Application->CreateForm(__classid(TFrmControl), &FrmControl);
temp=Command.SubString(3,Command.Length()-2);//获取命令行中的屏保预览窗口句柄的字符串形式
CPWindow =(long *)temp.ToInt();//将预览窗口句柄的字符串形式强制转换为长整形指针
RECT *lookrect;//建立一个RECT结构指针
Long style=GetWindowLong(Application->MainForm->Handle,GWL_STYLE);//获取FrmControl窗口的风格

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C BUILDER 动态建立菜单及菜单事件

下一篇: 用C Builder编写Tray程式