2011-10-30 6 views
1

私はそれにチェックボックスを持っているネイティブwin32 C++アプリケーションを持っています。チェックボックスを置き換え、2つの状態(チェックボックスのように)でON/OFFトグルボタンを作成したいと思います。チェックボックスにBS_OWNERDRAWのスタイルを追加して、WM_DRAWITEMのウィンドウに描画しました。問題は、チェックボックスをクリックすると、BS_OWNERDRAWのように、WM_COMMANDというメッセージが表示されますが、CHECKED状態は自動的に変更されません。この機能を実装する必要がありますか、何か不足していますか?ownerdrawnチェックボックス

チェックボックスをクリックハンドルコード:

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

残念ながら私はしませんでした。チェックボックス – blejzz

答えて

1

はい。 WM_COMMANDから翻訳して、CheckDlgButtonのようなもので内部チェック状態を切り替える必要があります。

+2

CheckDlgButtonは、BS_OWNERDRAWボタンではうまくいかないと思うBM_SETCHECKメッセージを生成する便利な関数です。私が知る限り、自分で内部チェックボックスの状態をチェックしたり、チェックを外したりする必要があります。 – cbranch

5

通常、ユーザーの入力に応じて自動的にオフに/チェックボックスのチェックを持つようにBS_AUTOCHECKBOXを設定します。しかし、ドキュメントによれば、BS_OWNERDRAWを使用するときは、他のスタイル(BS_AUTOCHECKBOXなど)を組み合わせることはできません。

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

+0

良い点を作成するコードで私の質問が更新されました。私はそれを自分で処理する必要がありますか? – blejzz

+0

もし私がBS_AUTOCHECKBOXを使うことができないのであれば、それは普通のボタンになるでしょうし、私はBM_GETCHECK/BM_SETCHECKを使うことができません。どのメッセージを使って同じ結果を得ることができますか? – blejzz