Chinaunix首页 | 论坛 | 博客
  • 博客访问: 537363
  • 博文数量: 576
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5020
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(576)

文章存档

2011年(1)

2008年(575)

我的朋友

分类:

2008-10-14 14:52:50

和我一起写屏保
作者:




对于屏幕保护程序,大家应该不会陌生。屏幕保护程序的后缀名是.scr,其实它就是一个可执行的.exe文件。
VC提供了一个支持屏幕保护的开发库scrnsave.lib,这个库已经定制了一个屏幕保护程序的框架结构,开发者只需要在完成相应的函数和提供相应的资源就可以写出自己的屏幕保护程序。
我们所需要完成的函数有:
// 屏幕保护程序的窗口函数,几乎所有的操作都在这里进行

BOOL WINAPI ScreenSaverProc(
HWND hWnd, 
UINT message,
WPARAM wParam,
LPARAM lParam); 
// 屏幕保护设置对话框的窗口函数
BOOL WINAPI ScreenSaverConfigureDialog(
HWND hDlg, 
 UINT message, 
 WPARAM wParam, 
 LPARAM lParam); 
// 在这里注册特殊的屏幕保护设置对话框的窗口类
BOOL WINAPI RegisterDialogClasses(
HANDLE hInst); 
好了,介绍了以上的内容,接下来我们就写一个最简单的屏幕保护程序:黑屏
跟着我,一步一步做吧。

首先,我们打开VC,建立一个Win32 Application 的工程。工程的名字就叫做SimpleScr好了。
接下来,向工程中加入一个对话框资源。(这个对话框当我们在桌面的属性中设置屏保时,点击“设置”时会看到)步骤如下:
1. 选择菜单 插入->资源类型 出现对话框,在对话框中选择 “Dialog”资源 然后 新建。
2. 保存资源 文件->保存 出现“另存为”对话框,在对话框中写入要保存的文件的名称:
SimpleScr.rc。
3. 将SimpleScr.rc 文件 和 resource.h 文件添加到工程中。
4. 将对话框的ID改为: DLG_SCRNSAVECONFIGURE
5. 编辑我们的对话框,在对话框中加入版本信息了什么的,自由发挥了 :)
6. 打开resource.h 文件修改,加入代码:

#include 
并去掉编辑器自动加入的 #define DLG_SCRNSAVECONFIGURE 101 这一行
因为DLG_SCRNSAVECONFIGURE 已经在 scrnsave.h中定义过了。
现在我们就开始改写前面说过的scrnsave.lib中的函数了,步骤如下:
1. 向工程中加入文件SimpleScr.cpp , 文件的内容如下:
// 程序需要的头文件
#include 

#pragma comment(lib,"scrnsave.lib") //使用库文件
#include "resource.h"

LRESULT CALLBACK ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) 
	{
		case WM_PAINT:
			{
				PAINTSTRUCT ps;
				HDC hDC = BeginPaint(hWnd, &ps);
				SetBkMode(hDC, TRANSPARENT);
				SetTextColor(hDC, RGB(0x33, 0xcc, 0));
				TextOut(hDC, 150, 150, "", 15);
				EndPaint(hWnd, &ps);
			}
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;		
		default:
			// 缺省的消息处理函数
			return DefScreenSaverProc(hWnd,message,wParam,lParam);
	}
	return 0;
}

BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) {

	case WM_COMMAND:
		//处理 确定 按钮
    	if (LOWORD(wParam) == IDOK) {
    		EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
					}
		else
		{
		//系统的处理退出命令
			EndDialog(hDlg, LOWORD(wParam));
			return TRUE;
		}

		break;
	}

	return FALSE;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
	return TRUE;
}
接下来,所需要做的就是保存文件,编译,还有就是将编译通过的文件后缀改为.scr 并将它拷贝到系统目录下看看运行结果了。


--------------------next---------------------

我用2005编译得,要修改一个String得位置
将s1 = str.GetAt(0) + str.GetAt(1);
改为
s1.AppendChar(str[0]);
s1.AppendChar(str[1]);
就可以编译了,别得不用动
( qqzhou1001 发表于 2007-5-13 2:36:00)
 
在microsoft visual studio .net 2003中编译通不过,
必须加
#pragma comment(lib,"comctl32.lib")
才能通过。 ( darnshong 发表于 2005-10-30 11:26:00)
 
谁能分析一下那个黑客帝国屏保的代码? ( 本立道生 发表于 2004-3-29 19:31:00)
 
多谢! ( stainlessdw 发表于 2003-7-1 16:54:00)
 
ren 11.exe 11.scr ( xipeng 发表于 2003-7-1 15:38:00)
 
setting->outfile: SimpleScr.scr  ok ( zfive5 发表于 2003-7-1 9:14:00)
 
怎么将编译通过的文件后缀改为.scr 阿 ( stainlessdw 发表于 2003-7-1 0:53:00)
 
.......................................................

--------------------next---------------------

阅读(267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~