リストコントロールのチェックボックスのクリックを無効にする方法で悩んでいます。
ダイアログボックスのリストコントロールへ次のようにチェックボックスをつけています。
DWORD dwStyle = m_lList01.GetExtendedStyle();
dwStyle |= LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
m_lList01.SetExtendedStyle(dwStyle);
ダイアログ描画の際には該当の行へチェックを入れて、クリックを無効にして表示を行い
たいのですが、良い方法が見つかりません。無効時にはチェックをグレー化にするのが望
ましいのですが、クリックの無効を先決に考えています。
皆様のアドバイス宜しくお願いします
開発環境:WinXP(SP2) VC++6.0 MFC
>該当の行へ
該当の行とは?
>チェックを入れて
誰が?ユーザが?プログラムが?
>クリックを無効にして表示を行いたいのですが、良い方法が見つかりません。
既にチェックされている状態はどうるするのか?
>無効時にはチェックをグレー化にするのが望ましいのですが、クリックの無効を先決に
考えています。
マウス左ボタンクリックを掴まえて、その該当する行ならクリックを受け捨てればいい。
レスありがとうございます。
>該当の行とは?
>誰が?ユーザが?プログラムが?
DBの様なレコードが何件か有り、そのデーターのフラグ条件によりチェックが入ります
ます。チェックを入れるのはダイアログ描画のタイミングでプログラムが行います。
>既にチェックされている状態はどうるするのか?
マウスを無効にしてクリックされても消されないようにしたいです。
>マウス左ボタンクリックを掴まえて、その該当する行ならクリックを受け捨てればいい。
実装方法が分かりません。参考になるソースはないでしょうか?
重ねてのお願いですが宜しくお願いします。
LVN_ITEMCHANGINGについて調べてみてはどうでしょう?
取り値で変更を禁止することもできるっぽいですが。
ユーザーがチェックをONOFFしないのなら
チェックボタン風のビットマップをON,OFFの二つ用意し
それを状態に合わせて表示する
だけで十分かも
> 実装方法が分かりません。参考になるソースはないでしょうか?
ですか。
最も当たり前な方法は「サブクラス化」することです。
SubclassWindow()について調べてください。
サブクラス化できれば、リストコントロールにWM_LBUTTONDOWNを処理
させるかどうかをコードできます。
別な方法として、
LVS_EX_CHECKBOXESを「外して」チェックがらみの部分を
自前でコードするという方法もあります。
もちろんチェックボックス等を自分で描画しなければなりませんので
オーナードローにする必要があるでしょう。
レスありがとうございました。
いろいろ試して見て仲澤サマのサブクラス化で方法で対処しました。
CListCtrlを規定クラスにCListCtrlSubを作成し、メンバ変数のタイ
プをCListCtrlSubとしました。
CListCtrlSub内で下記の様に各々のマウスイベントを捕らえてクリッ
クを阻止しました。OnLButtonDown内の様に場合によっては使い分けが可
能となります。
void CListCtrlSub::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_bFlag){
return;
}
CListCtrl::OnLButtonDown(nFlags, point);
}
void CListCtrlSub::OnLButtonDblClk(UINT nFlags, CPoint point)
{
return;
CListCtrl::OnLButtonDblClk(nFlags, point);
}
void CListCtrlSub::OnRButtonDown(UINT nFlags, CPoint point)
{
return;
CListCtrl::OnRButtonDown(nFlags, point);
}
void CListCtrlSub::OnRButtonDblClk(UINT nFlags, CPoint point)
{
return;
CListCtrl::OnRButtonDblClk(nFlags, point);
}
皆様のおかげで解決をする事が出来ました。
ありがとうございました。
OnLButtonDblClk()
OnRButtonDown()
OnRButtonDblClk()
return; で無条件終了するならば、これに続く
CListCtrl::On~ は必要無いですね。