3

チェックボックスが入っているネイティブのwin32c++アプリケーションがあります。チェックボックスを置き換えて、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 に答える