深入浅出屏幕保护程序编程.docx_第1页
深入浅出屏幕保护程序编程.docx_第2页
深入浅出屏幕保护程序编程.docx_第3页
深入浅出屏幕保护程序编程.docx_第4页
深入浅出屏幕保护程序编程.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深入浅出屏幕保护程序编程 - 读者对屏幕保护程序已经相当熟悉了。去年泰坦尼克号的屏幕保护程序风行了全世界,足见其魅力。有的屏幕保护程序功能十分强大,可以提供图象,动画,音频,视频等所有的多媒体功能。尽管可以很容易获得漂亮的屏幕保护程序,但拥有自己的屏幕保护程序对用户也许更有吸引力。 - VC5.0/6.0是开发屏幕保护程序的好工具。静态链接库SCRNSAVE.LIB对屏幕保护程序提供了支持。SCRNSAVE.LIB包含了建立屏幕保护程序的主程序和缺省功能,用户可以方便地使用SDK进行编程并与之连接。尽管SDK编程相对MFC麻烦,但编写相对简单的屏幕保护程序却相当容易甚至比用MFC编程更简单。 - 也可以使用MFC编写屏幕保护程序。但遗憾的是MFC不支持SCRNSAVE.LIB,必须手工完成原来由SCRNSAVE.LIB提供的功能,比较麻烦和不好理解。不过,编写复杂的屏幕保护程序时,MFC对于显示模块和对话框处理可以提供比SDK方便得多的功能。为简单起见先介绍如何使用SDK编写屏幕保护程序。 - 一. 屏幕保护程序和SCRNSAVE.LIB - 先从开发者的角度对屏幕保护程序说明如下: - 首先,屏幕保护程序是Win32 API 支持一种特殊的应用程序并由系统自动激活。其机制是当条件满足时,系统向当前活动窗口发出字参数 wParam 值为SC_SCREENSAVE 的WM_SYSCOMMAND消息,然后由当前活动窗口执行SYSTEM.INI文件中boot区指定的屏幕保护程序。 - 屏幕保护程序激活的条件是 在规定时间内没有鼠标或键盘输入. 当前的活动窗口是标准的WINDOWS应用程序。因为非WINDOWS应用,不会理睬WM_SYSCOMMAND消息。 显然,如果当前活动的程序接管了字参数 wParam 值为SC_SCREENSAVE 的WM_SYSCOMMAND 消息并且不传递到 DefWindowProc函数就可以禁止屏幕保护程序。这对某些运行中不愿意被打断的程序如视频播放,光盘刻录程序特别有用。 - 其次,可以在控制面板的显示器中选择需要的屏幕保护程序,并可以配置屏幕保护程序的参数。屏幕保护程序应该提供配置屏幕保护程序的对话框。 - 再次,屏幕保护程序有特别的输出函数,资源定义和变量声明。SCRNSAVE.LIB包含了建立屏幕保护程序的主程序。屏幕保护程序启动时SCRNSAVE.LIB自动创建一全屏窗口,并描述窗口类为无光标的满黑屏。 - 用户编写的屏幕保护程序必须包含三个基本函数ScreenSaverProc,ScreenSaverConfigureDialog 和RegisterDialogClasses 并与SCRNSAVE.LIB连接。 - 1ScreenSaverProc 窗口函数处理特定的消息并把未处理的消息传递给SCRNSAVE.LIB 。ScreenSaverProc 一般处理以下消息: - WM_CREATE 读取.INI或注册表的初始化数据,设置定时器以及其他初始化操作。 - WM_ERASEBKGND 擦除背景为下一步绘图作准备。 - WM_TIMER 进行绘图输出。用户可以实现自己的动画功能以及其他操作。 - WM_DESTROY 删除定时器以及其他对象 - ScreenSaverProc 把未处理的消息传递到SCRNSAVE.LIB中的 DefScreenSaverProc函数 处理。由它完成许多复杂和关键的操作比如何时激活,何时关闭等,大大方便了屏幕保护程序的编写。 - 2ScreenSaverConfigureDialog函数处理屏幕保护程序配置对话框。该对话框由控制面板的显示器设置程序调用。用户输入的配置数据输出到.INI或注册表中。 - 3. RegisterDialogClasses函数登记屏幕保护程序配置对话框的窗口类。如果不使用特殊的窗口或控件,可以简单地返回TRUE。 - 另外,编写屏幕保护程序还有一些原则。 为使控制面板能够识别,屏幕保护程序的扩展名必须改为.SCR并存放在WINDOWS目录下。 屏幕保护程序的图标(ICON)在资源文件中必须定义为ID_APP。ID_APP由系统的SCRNSAVE.H.定义。 资源文件中必须包含一描述字符串。该字符串用于控制面板显示屏幕保护程序的名字。它必须位于字符串表的首位。SCRNSAVE.H.定义其ID为1。 资源文件中屏幕保护程序配置对话框的ID必须为DLG_SCRNSAVECONFIGURE。它由系统的SCRNSAVE.H.定义。 - 二.编程实例 - 1.最小的屏幕保护程序MiniSaver。这是一个仅包含最基本模块的屏幕保护程序,运行时在屏幕上显示一行活动的文字。步骤如下: - 第一步,在VC5.0/6.0中建立32位应用工程(不选MFC WIZARD EXE).建立如下的MiniSaver.CPP文件: #include #include/ SCRNSAVE.LIB的头文件#include resource.h/声明三个基本的函数LRESULT WINAPI ScreenSaveProc(HWND,UINT,WPARAM,LPARAM);BOOL WINAPI ScreenSaveConfigureDialog(HWND,UINT,WPARAM,LPARAM);BOOL WINAPI RegisterDialogClasses(HINSTANCE);/定义三个基本的函数LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)HDC hDC;RECT rc;static int xpos;/文本的横坐标static char SlideText=欢迎使用屏幕保护程序!;static UINT timerID;/定时器switch (message) case WM_CREATE: xpos=0; timerID=SetTimer(hWnd,1,250,NULL);/设置定时器 break;case WM_ERASEBKGND:/空操作,交由DefScreenSaverProc处理break;case WM_TIMER: hDC=GetDC(hWnd); /清屏SetRect(&rc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)FillRect(hDC,&rc,GetStockObject(BLACK_BRUSH); /输出文本SetTextColor(hDC,RGB(255*rand(),255*rand(),255*rand();SetBkColor(hDC,RGB(0,0,0);TextOut(hDC,xpos,GetSystemMetrics(SM_CYSCREEN)/2, SlideText,strlen(SlideText); /移动文本的横坐标xpos=(xpos+10)%GetSystemMetrics(SM_CXSCREEN); ReleaseDC(hWnd,hDC); break; case WM_DESTROY: KillTimer(hWnd,timerID);/删除定时器 PostQuitMessage (0); return 0;return DefScreenSaverProc (hWnd,message,wParam,lParam);BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)/暂时不需要配置对话框,仅返回FALSEreturn FALSE;BOOL WINAPI RegisterDialogClasses(HINSTANCE hInstance)/一般不需要,仅返回TRUE return TRUE;- 第二步,定义资源文件MiniSaver.rc。在VC环境下生成一图标,其ID为ID_APP。向字符串表加入ID为IDS_DESCRIPTION字符串“MiniSaver”,并作为字符串表第一项 - 第三步,编译连接并将生成的MiniSaver.EXE更名为MiniSaver.SCR拷入WINDOWS目录。注意, 编译前一定要在Project菜单的Setting中的Link选项中加上SCRNSAVE.LIB库。 - 第四步,控制面板的显示器设置中选择屏幕保护程序MiniSaver就可以使用了。注意不要急于配置屏幕保护程序,因为MiniSaver还有没提供配置对话框。 - 2.较完整的屏幕保护程序MySaver。该屏幕保护程序提供了配置对话框和关于对话框,并且使用了图象显示。读者可以将自己喜爱的图象加到资源中。 - 第一步,在VC5.0/6.0中建立32位应用工程(不选MFC WIZARD EXE)并定义资源文件MiniSaver.rc。 - 在VC环境下生成一图标,其ID为ID_APP。 - 向字符串表加入ID为IDS_DESCRIPTION字符串“MiniSaver”,并作为字符串表第一项。加入ID为idsAPPName字符串“Screen Saver.MySaver”,说明见后面程序。 - 加入ID为IDB_BITMAP1的位图 - 加入ID为DLG_ABOUT对话框。仅有一ID为IDOK的按钮 - 加入ID为ID_APP。此对话的ID由SCRNSAVE.H定义且只能为DLG_SCRNSAVECONFIGURE。其中有ID为IDC_EDIT的EDIT控件,ID为IDOK,IDCANCEL和IDABOUT的按钮。 - 值得注意的是RESOURCE.H定义的ID_APP和DLG_SCRNSAVECONFIGURE可能与SCRNSAVE.H预定义的值冲突,可手动地将RESOURCE.H中的ID_APP设为100,DLG_SCRNSAVECONFIGURE设为2003即可。 - 第二步,建立如下的MySaver.CPP文件: #include #include #include resource.h/声明三个基本的函数LRESULT WINAPI ScreenSaveProc(HWND,UINT,WPARAM,LPARAM);BOOL WINAPI ScreenSaveConfigureDialog(HWND,UINT,WPARAM,LPARAM);BOOL WINAPI RegisterDialogClasses(HINSTANCE);BOOL WINAPI AboutDialog(HWND,UINT,WPARAM,LPARAM);/定义全局变量char szIniFileName=control.ini;/屏幕保护程序配置数据存放在control.ini文件char szSection32;/屏幕保护程序配置数据在control.ini文件位置区名称char szEntry=Slide Text:; /屏幕保护程序配置数据项名称char SlideText256;/屏幕保护程序配置数据,这里是文本内容/定义三个基本的函数LRESULT WINAPI ScreenSaverProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)static HBITMAP hBmp;/位图句柄HDC hDC,hMemDC;/hMemDC是内存设备,缓存位图。RECT rc;static int xpos=0;static UINT timerID;switch (message) case WM_CREATE:/文件位置区名称szSection赋值为资源idsAPPName。其中hMainInstance为/SCRNSAVE.LIB定义的屏幕保护程序实例句柄 LoadString(hMainInstance,idsAPPName, szSection,sizeof(szSection); strcpy(SlideText,欢迎使用屏幕保护程序!); /读control.ini文件中Screen Saver.MySaver 区的配置数据到SlideText GetPrivateProfileString(szSection,szEntry, SlideText,SlideText, sizeof(SlideText),szIniFileName); /取位图hBmp=LoadBitmap(hMainInstance,MAKEINTRESOURCE(IDB_BITMAP1); timerID=SetTimer(hWnd,1,250,NULL); break;case WM_ERASEBKGND: hDC=GetDC(hWnd); /显示位图 hMemDC=CreateCompatibleDC(hDC); SelectObject(hMemDC,hBmp); SetRect(&rc,0,0,GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)-25); BitBlt(hDC,rc.top,rc.left,rc.right,rc.bottom, hMemDC,rc.top,rc.left,SRCCOPY); /清除底行,为文本显示作准备。SetRect(&rc,0,GetSystemMetrics(SM_CYSCREEN)-25GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN); FillRect(hDC,&rc,GetStockObject(BLACK_BRUSH); ReleaseDC(hWnd,hDC); DeleteDC(hMemDC); return 1;case WM_TIMER: hDC=GetDC(hWnd); /清除底行SetRect(&rc,0,GetSystemMetrics(SM_CYSCREEN)-25,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN); FillRect(hDC,&rc,GetStockObject(BLACK_BRUSH); /输出文本 SetTextColor(hDC,RGB(255*rand(), 255*rand(),255*rand(); SetBkColor(hDC,RGB(0,0,0); TextOut(hDC,xpos,GetSystemMetrics(SM_CYSCREEN)-25, SlideText,strlen(SlideText); xpos=(xpos+10)%GetSystemMetrics(SM_CXSCREEN); ReleaseDC(hWnd,hDC); break; case WM_DESTROY: DeleteObject(hBmp); KillTimer(hWnd,timerID); PostQuitMessage (0); return 0;return DefScreenSaverProc (hWnd,message,wParam,lParam);BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)switch (message) case WM_INITDIALOG: LoadString(hMainInstance,idsAPPName, szSection,sizeof(szSection); strcpy(SlideText,欢迎使用屏幕保护程序!); GetPrivateProfileString(szSection, szEntry,SlideText, SlideText,sizeof(SlideText),szIniFileName); SetDlgItemText(hWnd,IDC_EDIT,SlideText); SetFocus(GetDlgItem(hWnd,IDC_EDIT); return FALSE;case WM_COMMAND: switch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论