简体   繁体   English

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

[英]Using WINAPI how do I change the value of a checkbox button?

Currently I have a checkbox created in WM_CREATE: 目前我在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);

I am trying to change it's value whenever another button is clicked with: 我试图在点击另一个按钮时改变它的值:

    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));

This does change the text displayed next to the checkbox but not the actual state of the button. 这会更改复选框旁边显示的文本,但不会更改按钮的实际状态。 Also I would like the checkbox to have only two states (checked or unchecked) is there any other way to create that effect other than in the button return have something along the lines of: 此外,我希望复选框只有两个状态(已选中或未选中)是否有任何其他方式来创建该效果,而不是在按钮返回时有以下内容:

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;
    }

EDIT: As Mark Ransom said I used messages with the BM_GETCHECK and BM_SETCHECK flag as so: 编辑:正如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);

BST_CHECKED and BST_UNCHECKED aren't window styles, they're simply flag values used by the CheckDlgButton and IsDlgButtonChecked API functions. BST_CHECKEDBST_UNCHECKED不是窗口样式,它们只是CheckDlgButtonIsDlgButtonChecked API函数使用的标志值。 CheckDlgButton is the function to call to change its state. CheckDlgButton是调用以更改其状态的函数。

(Or, you can send BM_SETCHECK and BM_GETCHECK messages directly to the button for the same effect). (或者,您可以将BM_SETCHECKBM_GETCHECK消息直接发送到按钮以获得相同的效果)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM