有没有一种方法可以检查按钮是否被选中?

时间:2019-11-30 20:35:57

标签: c++ windows winapi

我在安装程序,正在安装我的程序。

我想问用户是要创建桌面快捷方式还是在启动时运行程序。 为了使他能够在启动程序时运行或创建桌面快捷方式,他需要选中相应的复选框。

我的程序调试良好,没有错误,但是我有一个问题。

始终创建桌面快捷方式和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 :(得分:0)

我之所以发布此答案,是因为尽管我的简短评论似乎解决了OP的问题,但我现在意识到“解决方案”是不正确的:原因是我(错误地)认为IsDlgButtonChecked()函数返回BOOL值,指示该按钮是“选中”(= TRUE)还是“未选中”(= {FALSE)。

但是,这不是 情况,如the M/S documentation所示-实际上,它返回的UINT可以具有 三个 值:BST_UNCHECKED(= 0),BST_CHECKED(= 1)或BST_INDETERMINATE(= 2)。因此,在按钮具有“不确定”状态(在这种情况下意味着什么)的异常/不太可能的事件中,我的“快速解决方案”可能会失败。

我还注意到在OP的代码中,对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)
}