3

我有一个本机 win32 c++ 应用程序,其中有一个复选框。我想替换复选框并创建具有 2 种状态的 ON/OFF 切换按钮(就像复选框一样)。我已将BS_OWNERDRAW样式添加到复选框并将其绘制到WM_DRAWITEM. 问题是,当我单击复选框时,我收到一条WM_COMMAND消息(就像没有BS_OWNERDRAW)但 CHECKED 状态不会自动更改。我必须实现这个功能还是我错过了什么?

处理单击复选框的代码:

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

    switch (wmId)
    {
        case IDC_CHECKBOX:
            if(wmEvent == BN_CLICKED)
            {
                dwPos = SendMessage(checkBox, BM_GETCHECK, 0, 0);
                if(dwPos == BST_CHECKED ) 
                {
                   // do some stuff

                } else if(dwPos == BST_UNCHECKED) {
                    // do some stuff
                }
           }

问题是每次我点击复选框BM_GETCHECK都会返回BST_UNCHECKED。如果我删除 BS_OWNERDRAW 它工作正常。

创建按钮/复选框的代码:

   checkBox = CreateWindowEx(
        0,
        WC_BUTTON,
        szBuffer,
        WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_OWNERDRAW,
        BUTTON_ON_OFF_X, BUTTON_ON_OFF_Y,
        BUTTON_ON_OFF_WIDTH, BUTTON_ON_OFF_HEIGHT,
        hWnd, 
        (HMENU)IDC_CHECKBOX,
        hInst,
        NULL
   );
4

2 回答 2

6

通常,您将设置 BS_AUTOCHECKBOX 以使复选框自动选中/取消选中以响应用户输入。但是,根据文档,在使用 BS_OWNERDRAW 时不能组合其他样式(例如,BS_AUTOCHECKBOX)。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb775951%28v=vs.85%29.aspx

于 2011-10-30T14:34:24.050 回答
1

是的。您需要从 WM_COMMAND 进行翻译,并使用CheckDlgButton 之类的东西切换内部检查状态。

于 2011-10-30T17:41:30.680 回答