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

Posted

技术标签:

【中文标题】使用 WINAPI 如何更改复选框按钮的值?【英文标题】:Using WINAPI how do I change the value of a checkbox button? 【发布时间】:2014-12-02 19:28:33 【问题描述】:

目前我在 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;

【问题讨论】:

【参考方案1】:

您需要发送BM_SETCHECK 消息。

SendMessage(hwndButtonPollFlag, BM_SETCHECK, BST_CHECKED, 0);

【讨论】:

正在处理这个问题,只是在你在 BST_CHECKED 中编辑后它终于全部工作了,非常感谢! @JackHammered 对此感到抱歉,这是我的粗心大意。很高兴你成功了。【参考方案2】:

BST_CHECKEDBST_UNCHECKED 不是窗口样式,它们只是 CheckDlgButtonIsDlgButtonChecked API 函数使用的标志值。 CheckDlgButton 是调用来改变其状态的函数。

(或者,您可以将BM_SETCHECKBM_GETCHECK 消息直接发送到按钮以获得相同的效果)。

【讨论】:

以上是关于使用 WINAPI 如何更改复选框按钮的值?的主要内容,如果未能解决你的问题,请参考以下文章

c#如何获取comboBox当前选中的值

ag Grid如何在更改复选框的值后刷新

如何更改未选中复选框的值0

Angular 4 - 如何让我的复选框更改变量的值?

如何更改 localStorage 项目中的单个值?

当我在表格视图的搜索栏中搜索时如何检索复选框按钮位置更改