c++ - 使用 WINAPI 如何更改复选框按钮的值?

标签 c++ windows winapi

目前我在 WM_CREATE 中创建了一个复选框:

hwndButtonPollFlag = 
CreateWindow(
    TEXT("BUTTON"), 
    TEXT(sA.getMonitor(monitorSelected)->szDevice),
    WS_CHILD | WS_VISIBLE | SS_WHITERECT | BS_CHECKBOX, 
    0, 
    0, 
    0,
    0, 
    hwnd, 
    (HMENU)IDB_PollFlag, 
    hInstance, 
    NULL);

每当单击另一个按钮时,我试图更改它的值:

    if (sA.getScreenArray(monitorSelected)->getPollFlag())
    {
        SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_CHECKED);
    }
    else
    {
        SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_UNCHECKED);
    }
    SetWindowText(hwndButtonPollFlag, TEXT(sA.getMonitor(monitorSelected)->szDevice));

这确实会更改显示在复选框旁边的文本,但不会更改按钮的实际状态。此外,我希望复选框只有两种状态(选中或未选中),除了按钮返回之外,是否还有其他方法可以创建该效果:

switch (HIWORD(wParam))
    {
    case BST_CHECKED:
        sA.getScreenArray(monitorSelected)->setPollFlag(true);
        return 0;
    case BST_INDETERMINATE:
        if (sA.getScreenArray(monitorSelected)->getPollFlag())
        {
            SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_UNCHECKED);
        }
        else
        {
            SetWindowLongPtr(hwndButtonPollFlag, GCL_STYLE, WS_VISIBLE | BST_CHECKED);
        }
        return 0;
    case BST_UNCHECKED:
        sA.getScreenArray(monitorSelected)->setPollFlag(false);
        return 0;
    }

编辑:正如 Mark Ransom 所说,我使用带有 BM_GETCHECK 和 BM_SETCHECK 标志的消息:

    case IDB_MONITOR:
    monitorSelected = LOWORD(lParam);
    if (sA.getScreenArray(monitorSelected)->getPollFlag())
    {
        SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, NULL);
    }
    else
    {
        SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_UNCHECKED, NULL);
    }
    SetWindowText(hwndButtonPollFlag, TEXT(sA.getMonitor(monitorSelected)->szDevice));
    return 0;
case WM_COMMAND:
    //sA.getScreenArray(monitorSelected)->setPollFlag(LOWORD(lParam));
    switch (LOWORD(wParam))
    {
    case IDB_PollFlag:
        if (SendMessage(GetDlgItem(hwnd, IDB_PollFlag), BM_GETCHECK, 0, 0) == BST_CHECKED)
        {
            SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, NULL);
            sA.getScreenArray(monitorSelected)->setPollFlag(true);
        }
        else {
            SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_UNCHECKED, NULL);
            sA.getScreenArray(monitorSelected)->setPollFlag(false);
        }
        break;
    }
    return 0;

最佳答案

您需要发送 BM_SETCHECK消息。

SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, 0);

关于c++ - 使用 WINAPI 如何更改复选框按钮的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257368/

相关文章:

c++ - 带有非托管 SQLite 的混合 C++/CLI 代码

c++ - 二进制 'operator' : no operator defined which takes a left-hand operand of type 'type' (or there is no acceptable conversion)

c++ - 大数组的 CBLAS 段错误

c++ - 如何最小化QDialog?

c++ - 使用 C++ 将 IP 地址 append 到 char*

r - 为什么 file.exists 尽管位于 list.files 中却返回 FALSE?

C++ LPCTSTR 如何将命令行参数传递给子进程

c++ - C++ 对话框中的混淆函数

c++ - 获取复选框的大小

c++ - 您可以在不重新打开重新打开 win32 窗口的情况下执行需要提升的任务吗?