リストコントロールの行選択時の動作について – プログラミング – Home

リストコントロールの行選択時の動作につ...
 
通知
すべてクリア

[解決済] リストコントロールの行選択時の動作について


Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

.net 2005 MFCにて開発をしています。

リストコントロールの適当な行を選択すると
OnLvnItemchangedListSearchResult(NMHDR *pNMHDR, LRESULT *pResult)
が呼ばれ処理を行えますが、
処理終了後にその行は選択された状態になります。(青色で塗られた状態)

その後その行を再度クリックしても上記関数に反応がありません。
他の行を選択したりした後にクリックすればまた再度処理が行われるのですが、、
これはリストコントロールの仕様でしょうか?

コントロールは縦×横が20×3で、横一列同時に選択されるオプションとグリッド線を付
けています。
↓宣言場所
ListView_SetExtendedListViewStyle( m_cList_Alarm.m_hWnd, LVS_EX_FULLROWSELECT|
LVS_EX_GRIDLINES);

同じ行を何回押しても毎回処理が行われるようにしたいです。
分かる方よろしくお願いいたします。


引用未解決
トピックタグ
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

関数の名前から判断するとLVN_ITEMCHANGEDのハンドラとして
OnLvnItemchangedListSearchResult()を作成したと思われますが、
LVN_ITEMCHANGEDはアイテムが変更されたことをコントロールの親ウィンドウに
通知するものです。従って選択状態のアイテムをクリックしても選択状態が変わ
らないため、メッセージは通知されないため該当関数は呼び出されません。

クリックした時の通知メッセージはLVN_COLUMNCLICK、
キーボードを操作した時の通知メッセージはLVN_KEYDOWNです。
これらのメッセージを適切に処理すれば目的のことが可能となるでしょう。
ただし、上記の通知メッセージとLVN_ITEMCHANGEDの関係をよく理解して
実装する必要があるでしょう。


返信引用
Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

回答ありがとうございます。

おっしゃるようにイベントハンドラ
void CHD180ViewerDlg::OnLvnColumnclickListAlarm(NMHDR *pNMHDR, LRESULT
*pResult)
をウィザードから追加したのですが、リストをクリックしても処理が来ません。。
普通にリストをクリックするだけでは来ないのでしょうか?


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

LVN_COLUMNCLICKはレポート形式の時の、カラム(ヘッダーコントロール)をクリックした
ときかと思いますが。
エクスプローラの詳細表示の時の「ファイル名」「ファイルサイズ」等のところですね。

NM_CLICKではないかと思われますが、どうでしょう?
場合によっては、CListCtrl::HitTest()で調べる必要があるかもしれません。

LVN_ITEMACTIVATEなんてのもあるみたいですが…


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

失礼しました。よく調べず書いてしまいました。

確かにNM_CLICKでマウスクリックを捕まえて、HitTest()で調べればどの行をクリック
したかは分かりそうですね。

> 同じ行を何回押しても毎回処理が行われるようにしたいです。
とのことですが、キーボードで選択を変更したときも処理を行うのですよね。
そうだとすると、LVN_ITEMCHANGEDとNM_CLICKの両方を処理する必要がありそうですが、
LVN_ITEMCHANGEDはマウス操作の結果なのか、キーボード走査の結果なのかが分からな
いと思います。その結果マウスでの選択変更時に処理が2回行われないようにする必
要があると思います。


返信引用
Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

回答ありがとうございます。
誤解があったかもしれませんが
今回やりたいのはマウスクリック時のみでキーボードで選択された場合などは考えてい
ないです。
クリックされた行の内容を他の場所に表示するのですが
既に選択されている所をクリックしても何も反応が無かった為なぜかと思い質問させて
いただきました。
使用しているイベントハンドらがおかしかったのですね。。
CListCtrl::HitTest()調べてみます。


返信引用
Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

NM_CLICKのイベントハンドラをウィザードから追加したのですが
リストコントロールをクリックしても反応がありません。
追加の方法が悪いのでしょうか?
それともリストコントロールを1行選択にしているからでしょうか??


返信引用
Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

いろいろ試しているのですが、リストコントロールはエクセルのように表形式で表示さ
せているのですが、
一番上段の色が少し灰色になっているタイトル部分をクリックするとNM_CLICKに処理が
来ます。
ただ表の白い部分ですとクリックしても何も反応がありません。
何が問題なのでしょうか・・


返信引用
PATIQ
 PATIQ
(@PATIQ)
ゲスト
結合: 17年前
投稿: 3
 

どーも PATIQです

>一番上段の色が少し灰色になっているタイトル部分をクリックするとNM_CLICKに処理が
>来ます。
>ただ表の白い部分ですとクリックしても何も反応がありません。

私が試した限りでは、反対の現象が起こりますねぇ。
白いところをクリックするとハンドラにとんできますねぇ。

別のプロジェクトでリストコントロールだけをはりつけて、もう一度試してみれば答え
が見えてきたりするかも知れませんけど。


返信引用
Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

新規でプロジェクトを作成したところ問題なく処理が走りました。
設定の問題なのでしょうか・・・
少しずつ見直してみます。


返信引用
Hai
 Hai
(@Hai)
ゲスト
結合: 22年前
投稿: 26
Topic starter  

結局リストコントロールを新規で追加して解決しました。
元からあったコントロールのイベントハンドル追加ウィザードに問題があったようで
す。

VSSを使用している場合、ウィザードを使用して何かコントロールや関数を追加するとき
あらかじめ変更されるファイルを予想してチェックアウトしておかないと
うまくイベント関数が追加されなかったりする事があります。

なんとかして欲しいです・・・


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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