CListCtrlにチェックボックスを付けて、チェックイベントを知りたい – プログラミング – Home

CListCtrlにチェックボックスを...
 
通知
すべてクリア

CListCtrlにチェックボックスを付けて、チェックイベントを知りたい


みゆ
 みゆ
(@みゆ)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

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)){}

の条件で見ているのですが、チェックを見つけられません。

どのようにしたら、チェックがついた事がわかるのでしょうか?


引用解決済
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

CListCtrl::GetCheck を使ってみてはいかがでしょう。


返信引用
みゆ
 みゆ
(@みゆ)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

aetosさん

CListCtrl::GetCheck() では、

チェックボックスの変化があった後にチェック状態を取得できますが、
「チェックが入ったイベント」を取得することは出来ないと認識しています。

私の認識違いでしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

チェックが入ったイベントは OnLvnItemChanged で取得できるでしょう。
その中で GetChecked を呼べばいいのでは。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ただし、単純に OnLvnItemChanged で GetCheck するだけでは、この
OnLvnItemChanged が発生した原因がチェックによるものかどうかまではわかりません
ね。
そこまで判定したい場合は、アイテムごとの以前のチェック状態をどこかに保持してお
いて、OnLvnItemChanged で GetCheck した結果と比較することになるでしょう。


返信引用
みゆ
 みゆ
(@みゆ)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

aetosさん

OnLvnItemChanged()内でGetCheckする方法、試してみます。
(比較情報保持した上で)。

皆様

その他、方法があるようでしたら、アドバイスいただけるとうれしいです。
よろしくお願いします。


返信引用
みゆ
 みゆ
(@みゆ)
ゲスト
結合: 23年前
投稿: 9
Topic starter  

出来れば、
チェックボックスの設定変更イベントを捕まえる手段があると
とてもうれしいのですが。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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));
として比較すれば判断できそうです。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

LVN_ITEMCHANGEDが変更が終わった後に、
LVN_ITEMCHANGINGが変更しようとしている時に通知されます。

LVN_ITEMCHANGINGの戻り値で変更を受け入れるかどうかを制御できます。
# 受け入れないと…LVN_ITEMCHANGEDはおそらく通知されないでしょう。

LVN_ITEMCHANGINGでもuNewStateとuOldStateはあります。
# NMLISTVIEW構造体参照。
よって、判定方法はsubaruさんの書かれている通りで可能です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました