Приміром, у цьому розділі є вікно процедура діалоговому вікні показано нижче на малюнку.
Потрібні прапорці та перемикачі в діалоговому вікні кнопки є автоматичними. Прапорці є три держави. Кнопка Очистити кольори буде натиснувши кнопку за замовчуванням. Прапорці, перемикачі і кнопки визначено у файлі заголовок додатка, таким чином.
# визначити IDC_BOX1 101 / / перший прапорець # визначити IDC_BOX2 102 / / сек прапорець # визначити IDC_BOX3 103 / / третій прапорець # визначити IDC_REDBACK 104 / / Топ-перемикач # визначити IDC_BLUEBACK 105 / / знизу перемикач # визначити IDC_CLEARBOXES 107 / / Топ-кнопка # визначити IDC_CLEARBACK 108 / / знизу кнопка
Клацнувши будь-який з цих елементів керування призводить до зміни коробки, 1, 2 і 3. Ви повинні оголосити і визначити таку функцію малювати коробки, 1, 2 і 3.
втрати BoxPainter (HWND hDlg, / / вікна, ручка UINT uBox, / / полі малювати LRESULT lState); / / стан поле
В процедура вікно WM_CTLCOLORDLG повідомлення про застосування, що діалогового вікна може бути звернено. Якщо користувач натискає кнопку Очистити кольори (знаменувала прапор fClearColor), процедура функція SendDlgItemMessage використовується для зніміть прапорці та перемикачі. Повідомлення про BN_CLICKED містить ідентифікатори кнопки, яка була натиснута.
HBRUSH hbrRed, hbrBlue, hbrWhite;
BOOL fRedBack, fBlueBack, fClearColor; // background-state flags
BOOL CALLBACK ButtonProc(HWND hDlg, UINT message, WPARAM wParam,
LPARAM 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;
// Uncheck all check boxes and radio buttons.
SendDlgItemMessage(hDlg, // window handle
IDC_BOX1, // button identifier
BM_SETCHECK, // message
0, // check state unchecked)
0); // must be zero
SendDlgItemMessage(hDlg, IDC_BOX2, BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg, IDC_BOX3, BM_SETCHECK, 0, 0);
SendDlgItemMessage(hDlg,IDC_REDBACK,BM_SETCHECK,0,0);
SendDlgItemMessage(hDlg,IDC_BLUEBACK,BM_SETCHECK,0,0);
}
return (LRESULT) hbrWhite;
case WM_COMMAND:
if (wParam == IDOK)
{
EndDialog(hDlg, TRUE);
return TRUE;
}
if (HIWORD(wParam) == BN_CLICKED)
{
switch (LOWORD(wParam))
{
case IDC_BOX1:
// Retrieve the state of the check box.
lState = SendDlgItemMessage(
hDlg, IDC_BOX1, BM_GETSTATE,
0, 0);
BoxPainter(hDlg, 1, lState);
break;
case IDC_BOX2:
lState = SendDlgItemMessage(
hDlg, IDC_BOX2, BM_GETSTATE, 0, 0);
BoxPainter(hDlg, 2, lState);
break;
case IDC_BOX3:
lState = SendDlgItemMessage(
hDlg, IDC_BOX3, BM_GETSTATE, 0, 0);
BoxPainter(hDlg, 3, lState);
break;
case IDC_REDBACK:
fRedBack = TRUE;
InvalidateRect(hDlg, NULL, TRUE);
break;
case IDC_BLUEBACK:
fBlueBack = TRUE;
InvalidateRect(hDlg, NULL, TRUE);
break;
case IDC_CLEARBACK:
fClearColor = TRUE;
InvalidateRect(hDlg, NULL, TRUE);
break;
case IDC_CLEARBOXES:
BoxPainter(hDlg, 4, (LRESULT) 0);
break;
}
}
case WM_DESTROY:
DeleteObject(hbrRed);
DeleteObject(hbrBlue);
// Do not delete hbrWhite, because it is a stock object.
break;
}
return FALSE; // did not process a message
UNREFERENCED_PARAMETER(lParam);
}