對於屏幕保護程序,大家應該不會陌生。屏幕保護程序的後綴名是.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 <scrnsave.h>
並去掉編輯器自動加入的 #define DLG_SCRNSAVECONFIGURE 101 這一行
因為DLG_SCRNSAVECONFIGURE 已經在 scrnsave.h中定義過了。
現在我們就開始改寫前面說過的scrnsave.lib中的函數了,步驟如下:
1. 向工程中加入文件SimpleScr.cpp , 文件的內容如下:
// 程序需要的頭文件
#include <windows.h>
#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, "WWW.VCKBASE.COM", 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 並將它拷貝到系統目錄下看看運行結果了。