Есть ли способ проверить, проверена ли кнопка? - PullRequest
1 голос
/ 30 ноября 2019

Я работаю над установщиком, который устанавливает мою программу.

Я хочу спросить пользователя, хочет ли он создать ярлык на рабочем столе или запустить программу при запуске. Чтобы запустить программу при запуске или создать ярлык на рабочем столе, ему необходимо установить флажки.

Моя программа хорошо отлаживается, ошибок нет, но у меня есть одна проблема.

Ярлык на рабочем столе и функция RunAtStartup всегда создаются, я не знаю, как я могу проверить, отмечена ли кнопка или нет.

Есть ли способ проверить, отмечена ли кнопка?

Это мой код:

LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_COMMAND: {
        // Buttons Check
        if (wparam == IDC_BUTTON1)
        {
            BOOL checked = IsDlgButtonChecked(hwnd, IDC_BUTTON1);
            if (checked) {
                CheckDlgButton(hwnd, IDC_BUTTON1, BST_UNCHECKED);
            }
            else {
                CheckDlgButton(hwnd, IDC_BUTTON1, BST_CHECKED);
            }
        }
        if (wparam == IDC_BUTTON3)
        {
            BOOL checked = IsDlgButtonChecked(hwnd, IDC_BUTTON3);
            if (checked) {
                CheckDlgButton(hwnd, IDC_BUTTON3, BST_UNCHECKED);
            }
            else {
                CheckDlgButton(hwnd, IDC_BUTTON3, BST_CHECKED);
            }
        }

        // Install Part
        switch (wparam)
        {
        case IDC_BUTTON2:
            Start_Install(hwnd, wparam);
            if (IDC_BUTTON1 == IsDlgButtonChecked(hwnd, IDC_BUTTON1)) {

            }
            else {
                Sleep(5000);
                link();
            }
            if (IDC_BUTTON3 == IsDlgButtonChecked(hwnd, IDC_BUTTON3)) {

            }
            else {
                Sleep(5000);
                RunStartup();
            }
            Sleep(5000);
            PostQuitMessage(0);
            break;
        }
    }
}

Это только установка, если вам нужен полный код, попросите его, и я отредактирую.

1 Ответ

0 голосов
/ 01 декабря 2019

Я публикую этот ответ, потому что, хотя мой короткий комментарий решил проблему ОП, теперь я понимаю, что «решение» является неточным: причина в том, что я (неправильно) предположил, что функция 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...