虽然控制面板应用程序可能支持多个对话框,但它通过单个CPlApplet功能处理所有请求。在以下示例中,“控制面板”应用程序支持三个对话框,可让用户设置连接到计算机的组件立体声系统的首选项。该示例使用包含三个结构的应用程序定义的StereoApplets数组,每个对应于一个对话框。每个结构都包含CPL_INQUIRE消息所需的所有信息,以及CPL_DBLCLK消息所需的对话框模板和对话框过程。该代码演示了如何填充StereoApplets数组中的结构。
#define NUM_APPLETS 3
typedef struct tagAppletsenen
{
int icon; //图标资源标识符
int namestring; // name-string资源标识符
int descstring; // description-string资源标识符
int dlgtemplate; //对话框模板资源标识符
DLGPROC dlgfn; //对话框程序
} APPLETS;
APPLETS StereoApplets[NUM_APPLETS] =
{
AMP_ICON,AMP_NAME,AMP_DESC,AMP_DLG,AmpDlgProc,
TUNER_ICON,TUNER_NAME,TUNER_DESC,TUNER_DLG,TunerDlgProc,
TAPE_ICON,TAPE_NAME,TAPE_DESC,TAPE_DLG,TapeDlgProc,
};
HANDLE hinst = NULL;
LONG CALLBACK CPlApplet(hwndCPL,uMsg,lParam1,lParam2)
HWND hwndCPL; //控制面板窗口的句柄
UINT uMsg; // 信息
LPARAM lParam1; //第一个消息参数
LPARAM lParam2; //第二个消息参数
{
int i;
LPCPLINFO lpCPlInfo;
i = (int) lParam1;
开关(uMsg){
case CPL_INIT: //第一个消息,发送一次
hinst = GetModuleHandle("ecp.cpl");
return TRUE;
case CPL_GETCOUNT: //第二个消息,发送一次
return NUM_APPLETS;
break;
case CPL_INQUIRE: //第三条消息,每次应用发送一次
lpCPlInfo = (LPCPLINFO) lParam2;
lpCPlInfo->lData = 0;
lpCPlInfo->idIcon = StereoApplets[i].icon;
lpCPlInfo->idName = StereoApplets[i].namestring;
lpCPlInfo->idInfo = StereoApplets[i].descstring;
break;
case CPL_DBLCLK: //应用程序图标双击
DialogBox(hinst,
MAKEINTRESOURCE(StereoApplets[i].dlgtemplate),
hwndCPL, StereoApplets[i].dlgfn);
break;
case CPL_STOP: //在CPL_EXIT之前每个应用程序发送一次
break;
case CPL_EXIT: //在FreeLibrary被调用之前发送一次
break;
默认:
break;
}
return 0;
}