CDialogクラスに配置したCListCtrl m_listがあります。
m_listにチェックボックスを付けたく、
m_list.SetExtendedStyle( LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES |
LVS_EX_FULLROWSELECT );
をしています。
チェックボックスにチェックがついたときを拾いたいと思い、
m_listのイベント関数OnLvnItemchangedListUnit()を追加し、
if (pNMLV->uNewState & (LVIS_SELECTED | LVIS_FOCUSED)){}
の条件で見ているのですが、チェックを見つけられません。
どのようにしたら、チェックがついた事がわかるのでしょうか?
CListCtrl::GetCheck を使ってみてはいかがでしょう。
aetosさん
CListCtrl::GetCheck() では、
チェックボックスの変化があった後にチェック状態を取得できますが、
「チェックが入ったイベント」を取得することは出来ないと認識しています。
私の認識違いでしょうか?
チェックが入ったイベントは OnLvnItemChanged で取得できるでしょう。
その中で GetChecked を呼べばいいのでは。
ただし、単純に OnLvnItemChanged で GetCheck するだけでは、この
OnLvnItemChanged が発生した原因がチェックによるものかどうかまではわかりません
ね。
そこまで判定したい場合は、アイテムごとの以前のチェック状態をどこかに保持してお
いて、OnLvnItemChanged で GetCheck した結果と比較することになるでしょう。
aetosさん
OnLvnItemChanged()内でGetCheckする方法、試してみます。
(比較情報保持した上で)。
皆様
その他、方法があるようでしたら、アドバイスいただけるとうれしいです。
よろしくお願いします。
出来れば、
チェックボックスの設定変更イベントを捕まえる手段があると
とてもうれしいのですが。
OnLvnItemChanged の発生原因がチェックによるものの場合は
pNMLV->uNewState、pNMLV->uOldState の値をLVIS_STATEIMAGEMASK でマスクすると、
INDEXTOSTATEIMAGEMASK(1) がチェックなし
INDEXTOSTATEIMAGEMASK(2) がチェックあり
になるようです。
新旧それぞれのチェック状態を
bool newCheck =
((pNMLV->uNewState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2));
bool oldCheck =
((pNMLV->uOldState & LVIS_STATEIMAGEMASK) == INDEXTOSTATEIMAGEMASK(2));
として比較すれば判断できそうです。
LVN_ITEMCHANGEDが変更が終わった後に、
LVN_ITEMCHANGINGが変更しようとしている時に通知されます。
LVN_ITEMCHANGINGの戻り値で変更を受け入れるかどうかを制御できます。
# 受け入れないと…LVN_ITEMCHANGEDはおそらく通知されないでしょう。
LVN_ITEMCHANGINGでもuNewStateとuOldStateはあります。
# NMLISTVIEW構造体参照。
よって、判定方法はsubaruさんの書かれている通りで可能です。