本节中的示例是对话框的窗口过程,如下图所示。
按钮对话框中的复选框和单选按钮是自动的。复选框为三态。清除颜色按钮是默认的按钮。复选框,单选按钮和按钮在应用程序的头文件中定义如下。
#define IDB_BOX1 101 //第一个复选框
#define IDB_BOX2 102 //第二个复选框
#define IDB_BOX3 103 //第三个复选框
#define IDB_REDBACK 104 //顶部单选按钮
#define IDB_BLUEBACK 105 //底部单选按钮
#define IDB_CLEARBOXES 107 //顶部按钮
#define IDB_CLEARBACK 108 //底部按钮
HBRUSH hbrRed, hbrBlue, hbrWhite;
BOOL fRedBack, fBlueBack, fClearColor; //后台状态标志
请注意,没有必要定义IDOK,OK按钮的标识符。
在以下窗口过程中,WM_CTLCOLORDLG消息通知应用程序该对话框即将被绘制。如果用户按清除颜色按钮(由fClearColor标志表示),则该过程使用SendDlgItemMessage功能取消选中复选框和单选按钮。BN_CLICKED通知消息包含按钮的标识符。
LRESULT APIENTRY ButtonProc(hDlg,message,wParam,lParam)
HWND hDlg; //对话框的窗口句柄
UINT message; //消息类型
UINT wParam; //消息特定信息
LONG lParam;
{
LRESULT lState;
switch(message){
case WM_INITDIALOG:
hbrRed = CreateSolidBrush(RGB(255, 0, 0));
hbrBlue = CreateSolidBrush(RGB(0, 0, 255));
hbrWhite = GetStockObject(WHITE_BRUSH);
return TRUE;
case WM_CTLCOLORDLG:
if(fRedBack){
fRedBack = FALSE;
return (LRESULT) hbrRed;
}
else if(fBlueBack){
fBlueBack = FALSE;
return (LRESULT) hbrBlue;
}
else if(fClearColor){
fClearColor = FALSE;
//取消选中所有复选框和单选按钮。
SendDlgItemMessage(hDlg, //窗口句柄
IDB_BOX1, //按钮标识符
BM_SETCHECK, // 信息
0, //检查状态未选中)
0); //必须为零
SendDlgItemMessage(hDlg,IDB_BOX2,
BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg,IDB_BOX3,
BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg,IDB_REDBACK,
BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg,IDB_BLUEBACK,
BM_SETCHECK, 0, 0);
}
return (LRESULT) hbrWhite;
case WM_COMMAND:
if (wParam == IDOK) {
EndDialog(hDlg, TRUE);
return TRUE;
}
if (HIWORD(wParam) == BN_CLICKED) {
开关(LOWORD(wParam)){
case IDB_BOX1:
//检索状态
//复选框。
lState = SendDlgItemMessage(
hDlg,IDB_BOX1,BM_GETSTATE,
0, 0);
//框画功能是
//应用程序定义
BoxPainter(
hDlg, //窗口句柄
1, //框画
lState); //框的状态
break;
case IDB_BOX2:
lState = SendDlgItemMessage(
hDlg,IDB_BOX2,BM_GETSTATE,
0, 0);
BoxPainter(hDlg, 2, lState);
break;
case IDB_BOX3:
lState = SendDlgItemMessage(
hDlg,IDB_BOX3,BM_GETSTATE,
0, 0);
BoxPainter(hDlg, 3, lState);
break;
case IDB_REDBACK:
fRedBack = TRUE;
InvalidateRect(hDlg,NULL,
TRUE);
break;
case IDB_BLUEBACK:
fBlueBack = TRUE;
InvalidateRect(hDlg,NULL,
TRUE);
break;
case IDB_CLEARBACK:
fClearColor = TRUE;
InvalidateRect(hDlg,NULL,
TRUE);
break;
case IDB_CLEARBOXES:
BoxPainter(hDlg,4,
(LRESULT) 0);
break;
}
}
case WM_DESTROY:
DeleteObject(hbrRed);
DeleteObject(hbrBlue);
//不要删除hbrWhite,因为它是一个
//库存物品
break;
}
return FALSE; //没有处理消息
UNREFERENCED_PARAMETER(lParam);
}