c++ - BM_GETCHECK 不工作

标签 c++ winapi

我有这样的代码:

In WM_CREATE

    hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP | WS_TABSTOP,150,323,300,20,hwnd,0,hInstance,0) ;


In WM_COMMAND

    if ( SendMessage( hCheckBox , BM_GETCHECK, (WPARAM) NULL, (LPARAM) NULL ) == BST_CHECKED )
        MessageBox( 0, "Working", "Msg", 0 );

复选框是否被选中并不重要,它永远不会返回 BST_CHECKED。 试图让它在最后 2 小时内工作:(

最佳答案

hCheckBox 是否是局部自动变量并不完全清楚。如果是这样,我可以向您保证,从触发 CreateWindow 到收到 WM_COMMAND 消息,它不会保持其值。改用这个:

LRESULT chk = SendDlgItemMessage(hDlg, IDC_CHECKBOX_CTRL_ID, BM_GETCHECK, 0, 0);

hDlg 是您的对话框或主窗口句柄,IDC_CHECKBOX_CTRL_ID 是控件 ID。为此,您需要将控件 ID 指定为创建调用的 HMENU 参数的非零值:

hCheckBox = CreateWindowEx(0,"Button","Random text", WS_CHILD | WS_VISIBLE | 
    WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
    WS_TABSTOP,150,323,300,20,hwnd, IDC_CHECKBOX_CTRL_ID, hInstance,0);

万一它不明显。将 IDC_CHECKBOX_CTRL_ID 定义为非零整数。


编辑

假设控件设置正确,您应该能够在 WndProc 中处理此复选框的 WM_COMMAND,如下所示

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    switch (message)
    {
    case WM_CREATE:
        CreateWindowExA(0,"Button","Random text", WS_CHILD | WS_VISIBLE | 
            WS_CLIPSIBLINGS| BS_AUTOCHECKBOX | BS_TEXT | WS_GROUP |
            WS_TABSTOP,100,100,300,48, hWnd, (HMENU)IDC_CHECKBOX_CTRL_ID, hInst, 0);
        break;

    case WM_COMMAND:
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);

        // Parse the menu selections:
        if (wmId == IDC_CHECKBOX_CTRL_ID)
        {
            if (wmEvent == BN_CLICKED)
            {
                LRESULT chkState = SendMessage((HWND)lParam, BM_GETCHECK, 0, 0);
                if (chkState == BST_CHECKED)
                    MessageBoxA(hWnd, "Checkbox is checked!", "CheckBox", MB_OK);
            }
            break;
        };
        // fall-thru intentional

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    };

    return 0;
}

我只是将其放入带有空白窗口的库存通用 WIN32 应用程序中。结果如下图所示:

Results of checking the checkbox

关于c++ - BM_GETCHECK 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593051/

相关文章:

c++ - GetComputerName() 返回空结果

windows - 在不重新启动的情况下重新初始化 Windows 事件日志服务

c++ - 移动指针类型的构造函数?

c++ - 在 c header 中使用来自 c++ header 的枚举类

c++ - CToolBar MFC 64 位在 32 位上运行时崩溃

python - 以编程方式旋转监视器

c++ - 在 native C++ 中停靠控件

c++ - 显式调用 WINAPI ReadFile()

c++ - 通过ostream输出一个C数组

c++ - MSVCP110.dll 丢失