大多数屏幕保护程序提供一个配置对话框,让用户指定自定义数据,如独特颜色,绘制速度,线条粗细,字体等。要支持配置对话框,应用程序必须提供对话框模板,并且还必须支持ScreenSaverConfigureDialog功能。以下是示例应用程序的对话框模板。
DLG_SCRNSAVECONFIGURE DIALOG 6, 18, 160, 63
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU
CAPTION“屏幕保护程序示例”
FONT 8,“MS Shell Dlg”
BEGIN
GROUPBOX“重绘速度”,101,0,6,98,40
SCROLLBAR ID_SPEED, 5, 31, 89, 10
LTEXT“Fast”,103,6,21,20,8
LTEXT“慢”,104,75,21,20,8
PUSHBUTTON "OK", ID_OK, 117, 10, 40, 14
PUSHBUTTON“取消”,ID_CANCEL,117,32,40,14
END
您必须使用十进制值2003定义用于标识对话框模板的常量,如以下示例所示。
#define DLG_SCRNSAVECONFIGURE 2003
以下示例显示了示例应用程序中的ScreenSaverConfigureDialog功能。
#define MINVEL 1 / *最小重绘速度值* /
#define MAXVEL 10 / *最大重绘速度值* /
#define DEFVEL 5 / *默认重绘速度值* /
LONG lSpeed = DEFVEL; /* redraw-speed variable */
extern HINSTANCE hMainInstance; /* screen saver instance handle */
CHAR szAppName [80]; / *的.ini段名* /
CHAR szTemp [20]; / *临时字符数组* /
CHAR szRedrawSpeed[] = "Redraw Speed"; /* .INI speed entry */
BOOL WINAPI ScreenSaverConfigureDialog(hDlg, message, wParam, lParam)
HWND hDlg;
UINT message;
DWORD wParam;
LONG lParam;
{
static HWND hSpeed; /* handle of speed scroll bar */
static HWND hOK; /* handle of OK push button */
开关(消息)
{
case WM_INITDIALOG:
/ *从.RC文件中检索应用程序名称。*/
LoadString(hMainInstance, idsAppName, szAppName, 40);
/ *检索.INI(或注册表)文件名。*/
LoadString(hMainInstance,idsIniFile,szIniFile,
MAXFILELEN);
/ *从注册表检索任何重绘数据。*/
lSpeed = GetPrivateProfileInt(szAppName, szRedrawSpeed,
DEFVEL, szIniFile);
/*
*如果初始化文件不包含条目
*对于此屏幕保护程序,请使用默认值。
*/
if(lSpeed > MAXVEL || lSpeed < MINVEL)
lSpeed = DEFVEL;
/ *初始化重绘速度滚动条控件。*/
hSpeed = GetDlgItem(hDlg, ID_SPEED);
SetScrollRange(hSpeed, SB_CTL, MINVEL, MAXVEL, FALSE);
SetScrollPos(hSpeed, SB_CTL, lSpeed, TRUE);
/ *检索OK按钮控件的句柄。*/
hOK = GetDlgItem(hDlg, ID_OK);
return TRUE;
case WM_HSCROLL:
/*
*进程滚动条输入,调整lSpeed
*值适当。
*/
开关(LOWORD(wParam))
{
case SB_PAGEUP:
--lSpeed;
break;
case SB_LINEUP:
--lSpeed;
break;
case SB_PAGEDOWN:
++lSpeed;
break;
case SB_LINEDOWN:
++lSpeed;
break;
case SB_THUMBPOSITION:
lSpeed = HIWORD(wParam);
break;
case SB_BOTTOM:
lSpeed = MINVEL;
break;
case SB_TOP:
lSpeed = MAXVEL;
break;
case SB_THUMBTRACK:
case SB_ENDSCROLL:
return TRUE;
break;
}
if ((int) lSpeed <= MINVEL)
lSpeed = MINVEL;
if ((int) lSpeed >= MAXVEL)
lSpeed = MAXVEL;
SetScrollPos((HWND) lParam, SB_CTL, lSpeed, TRUE);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_OK:
/*
*将当前的重绘速度变量写入
* .ini文件。
*/
wsprintf(szTemp, "%ld", lSpeed);
WritePrivateProfileString(szAppName,szRedrawSpeed,
szTemp, szIniFile);
case ID_CANCEL:
EndDialog(hDlg, LOWORD(wParam) == ID_OK);
return TRUE;
}
}
return FALSE;
}
除了提供对话框模板和支持ScreenSaverConfigureDialog功能外,应用程序还必须支持RegisterDialogClasses功能。此函数注册屏幕保护程序所需的任何非标准窗口类。因为示例应用程序在其对话框过程中仅使用标准窗口类,所以该函数只返回TRUE,如以下示例所示。
BOOL WINAPI RegisterDialogClasses(hInst)
HANDLE hInst;
{
return TRUE;
}