MFC
2段階と3段階チェックボックスを切り替えて使う


HomeProgramming TipsMFC Tips[MFC-023]

 ダウンロード : 曖昧(3モード)チェックボックスプログラムサンプル(2006/09/16) 

通常、MFC でのチェックボックス使用ではチェックボックスは ON / OFF を現すようになっています。
そのチェック内容が一つの事項だけを現している場合は、この仕様がとても適切なんですが、
まれに複数の状態をチェックボックスで表現したい場合があります。

例えば、A,B,C という三つの BOOL 変数があり、それぞれが 1,0,0 という状態で、
ユーザーにこれを「全てON」「現在の状態」「全てOFF」と切り替えさせたい時って無いですか?
これを実現するにはチェックボックスに BS_3STATE または BS_AUTO3STATE をスタイル指定すると良いと教えてもらいました。
※ 通りすがりさんありがとうございます。

ところがこれをこのまま実装すると一つだけ困る事が起きます。
初期状態で A,B,C の三つの BOOL 変数が全て同じ場合です。
このような状態ですと曖昧な状態は存在しないため、中間の状態は不要となります。

そのため、チェックボックスのスタイルは固定ではなく動的に変化させるようにします。
まずボタンに CButton コントロールを変数の追加で割り当てます。
カテゴリは Control で、種類は CHECK となります。
ここでは、仮に m_chkTest というコントロール変数を作ったとします。


    CButton m_chkTest;


この m_chkTest のスタイル変更をするだけで曖昧な状態を表現する事が出来ます。
設定するスタイルは BS_3STATE または BS_AUTO3STATE となります。
お勧めは自動的に状態が変わる BS_AUTO3STATE です。
元に戻すにはスタイルに BS_AUTOCHECKBOX を加えます。


    // 2段階チェックボックスに設定する
    m_chkTest.ModifyStyle(BS_AUTO3STATE, BS_AUTOCHECKBOX);

    // 3段階チェックボックスに設定する
    m_chkTest.ModifyStyle(BS_AUTOCHECKBOX, BS_AUTO3STATE);


これで GetCheck() メソッドにて現在のチェック情報が取得出来るようになります。
取得出来る状態は次の3種類です。
イベントハンドラの追加で BN_CLICKED からメンバ関数を作り、チェックが変更された処理を作るなどすればよいでしょう。
なお、ダイアログにて[適用]ボタンが押されたときは、もう一度チェックボタンのスタイルを初期化します。


void CFooDlg::OnBnClickedTest()
{
    switch (m_chkTest.GetCheck()) {

        case BST_CHECKED:
            // チェック状態の処理を記述する
            break;

        case BST_INDETERMINATE:
            // 曖昧状態の処理を記述する
            break;

        case BST_UNCHECKED:
            // 非チェック状態の処理を記述する
            break;
    }
}




 Copyright 2005 VALGUS. All Rights Reserved.