|
チェックリストボックスを作る
今回は次のような、チェックボックス付きのリストボックスを作ってみます。

まず、リソースエディタでリストボックスを作成します。チェックリストボックスも、リソースエディタ上ではリストボックスで作ります。今回はリストボックスとボタン1つを追加しました。

次は、リストボックスのプロパティを設定します。ここではリソースIDを設定し、「Owner Draw」を「固定」にします。チェックリストボックスはオーナードローのリストボックスです。といっても自分で描画処理を記述しなくても作ることができます。また、「Has String」を「True」にします。こうしないと、文字列のアイテムを追加できません。

チェックリストボックスの操作はCCheckListBoxクラスを使うので、Control型のDDX変数を追加すると操作が楽になります。また、インデックス値の取得/設定のために、value型のDDX変数も追加します。
では、DDX変数を追加しましょう。リストボックスを右クリックし、「変数の追加」を選択します。

アクセスはprivate、「コントロール変数」をチェックし、カテゴリにvalueを選択します。変数のデータ型はインデックス値なのでint型にします。
変数名はメンバ変数となるのでm_で始まる名前にするとよいでしょう。次にもう一度「変数の追加」を選び、今度はカテゴリにControlを選択します。これでCCheckListBox型の変数を追加できます。

リストボックスに変数を追加したら、さらにボタンにBN_CLICKEDのメッセージハンドラを追加します。(ボタンのイベントハンドラの追加方法は、「ボタンの基本」を見てください。)
では、コードのほうを実装していきましょう。OnInitDialog()で初期化します。基本的な操作はリストボックスと同じです。ここではアイテムを3つ追加しています。
BOOL CCheckListDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
// TODO: 初期化をここに追加します。
{
int err = 0, lbErr = 0;
// アイテム挿入
if (!err)
{
lbErr = m_xcCheckList.InsertString(-1, _T("ITEM1"));
if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1;
}
if (!err)
{
lbErr = m_xcCheckList.InsertString(-1, _T("ITEM2"));
if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1;
}
if (!err)
{
lbErr = m_xcCheckList.InsertString(-1, _T("ITEM3"));
if (lbErr == LB_ERR || lbErr == LB_ERRSPACE) err = 1;
}
if (!err)
{
// 2番目のアイテムを無効にする
m_xcCheckList.Enable(1, FALSE);
m_xvCheckList = 0;
UpdateData(FALSE);
}
}
return TRUE;
}
|
チェックリストボックスの場合、アイテムの有効/無効を設定することができます。設定はCCheckListBox::Enable()関数を使います。ここでは、2番目のアイテムだけ無効にしてみました。
| void CCheckListBox::Enable(int nIndex, BOOL bEnabled = TRUE); |
| 説明: |
アイテムの有効/無効を設定 |
| 引数: |
nIndex:アイテムのインデックス
bEnabled:有効の場合TRUE、無効の場合FALSE |
| 戻り値: |
なし |
ボタンのイベントハンドラの内容は次のようにしました。UpdateData()でDDX変数の値を更新し、メッセージボックスに文字列とチェック状態を表示します。m_xvCheckListには現在選択されているアイテムのインデックスが入っています。CListBox::GetText()は、指定したインデックスの文字列を取得します。
// "読み取り"ボタン押下
void CCheckListDlg::OnBnClickedBtnRead()
{
CString str;
UpdateData();
// アイテムテキスト取得
m_xcCheckList.GetText(m_xvCheckList, str);
// チェック状態取得
str += (m_xcCheckList.GetCheck(m_xvCheckList) == 1) ?
_T(":チェックされています。") : _T(":チェックされていません。");
MessageBox(str);
}
|
アイテムのチェック状態を取得するには、CCheckListBox::GetCheck()関数を使います。
| int CCheckListBox::GetCheck(int nIndex); |
| 説明: |
アイテムのチェック状態を取得 |
| 引数: |
nIndex:アイテムのインデックス |
| 戻り値: |
チェックされていない場合は0、チェックされている場合は1、不確定の場合は2 |
では、ビルドして実行してみましょう。"読み取り"ボタンを押すと、リストボックスで現在選択されている文字列と、チェック状態がメッセージボックスに表示されます。

|