Я публикую этот ответ, потому что, хотя мой короткий комментарий решил проблему ОП, теперь я понимаю, что «решение» является неточным: причина в том, что я (неправильно) предположил, что функция IsDlgButtonChecked()
возвращаетBOOL
значение, указывающее, является ли кнопка «отмеченной» (= TRUE
) или «непроверенной» (= FALSE
).
Однако, это не , так каккак видно из документации M / S - фактически она возвращает UINT
, которая может иметь одно из трех значений: BST_UNCHECKED
(=0), BST_CHECKED
(= 1) или BST_INDETERMINATE
(= 2). Таким образом, в необычном / маловероятном случае, когда кнопка имеет «неопределенный» статус (что бы это ни значило в данном случае), мое «быстрое решение», скорее всего, потерпит неудачу.
Я также заметил в коде ОП, чтоявляются ненужными / избыточными проверками значения wparam
- которое не изменяется в течение данной функции. Сочетание проверок if (wparam == ...
и последующего блока switch(wparam) ...
можно значительно упростить до единого switch
следующим образом (учитывая также «исправленные» проверки результатов IsDlgButtonChecked
):
LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
BOOL checked;
LRESULT answer = DefWndProc(hwnd, msg, wparam, lparam); // Or something similar
switch (msg)
{
case WM_COMMAND: {
switch (wparam)
{
// Buttons Check
case IDC_BUTTON1:
checked = IsDlgButtonChecked(hwnd, IDC_BUTTON1);
if (checked == BST_CHECKED) CheckDlgButton(hwnd, IDC_BUTTON1, BST_UNCHECKED);
else CheckDlgButton(hwnd, IDC_BUTTON1, BST_CHECKED);
break;
case IDC_BUTTON3:
checked = IsDlgButtonChecked(hwnd, IDC_BUTTON3);
if (checked == BST_CHECKED) CheckDlgButton(hwnd, IDC_BUTTON3, BST_UNCHECKED);
else CheckDlgButton(hwnd, IDC_BUTTON3, BST_CHECKED);
break;
// Install Part
case IDC_BUTTON2:
Start_Install(hwnd, wparam);
if (IDC_BUTTON1 == IsDlgButtonChecked(hwnd, IDC_BUTTON1) == BST_CHECKED) {
//..
}
else {
Sleep(5000);
link();
}
if (IsDlgButtonChecked(hwnd, IDC_BUTTON3) == BST_CHECKED) {
//..
}
else {
Sleep(5000);
RunStartup();
}
Sleep(5000);
PostQuitMessage(0);
break;
}
}
}
return answer; // Need to set "answer" accordingly, probably dependent on the actions taken in the SWITCH block(s)
}