使用不是所有者绘制的按钮

【勇芳软件工作室】汉化HomePreviousNext

本节中的示例是对话框的窗口过程,如下图所示。

按钮对话框中的复选框和单选按钮是自动的。复选框为三态。清除颜色按钮是默认的按钮。复选框,单选按钮和按钮在应用程序的头文件中定义如下。

#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);

}