• ベストアンサー

リストビューの選択状態を取得するメッセージはありますか?

リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、エディットボックスが空欄では無いときに、 あるボタンを有効にするという処理をしたいと思っています。 リストビューが選択されていることを教えてくれるメッセージがあれば、教えてください。よろしくお願いします。 環境:Win32 API, VC++6.0

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス >また話は少し変わってしまうのですが、リストビューに項目を追加したときに、 >その追加した行にフォーカスが合って、スクロールバーが自動的に下がってくるように >することは可能でしょうか。  ↑  可能です。  ListView_EnsureVisible( hList, 追加した行, TRUE );  とします。これで自動的に最後に追加した行にスクロールします。 ・あとちょっと不明な点がありますが、  (1)追加した行にフォーカスを合わせるのか?  (2)追加した行に範囲選択を設定するのか?  どっちでしょうか。  どちらにしても ListView_SetItemState() マクロで設定できますけど。 ・(1)フォーカスを合わせる  ListView_SetItemState( hList, 追加した行, LVIS_FOCUSED, LVIS_FOCUSED ); ・(2)追加した行に範囲選択を設定する  ListView_SetItemState( hList, 追加した行, LVIS_SELECTED, LVIS_SELECTED );  とします。 ※フォーカスと範囲選択は違います。注意。 >今回はある特定の行ではなく、リストビューのどこかの行が選択されているという >イベントハンドラがあればと思っているのですが、そのようなものはあるのでしょうか。  ↑  イベントハンドラはないと思いますけど。  その代わりに ListView_GetItemState()、ListView_GetNextItem() マクロのチェックで  分かると思います。ListView_GetNextItem() で LVIS_SELECTED フラグを見つければ  その行とかが分かると思います。 ・あるいは先頭行から順番に ListView_GetItemState() マクロで LVIS_SELECTED フラグが  立っている行を自分で検索するとかすれば良い。  詳しくは下の『参考URL』をどうぞ。 ・以上。

参考URL:
http://www.geocities.jp/ekakibuta/Programing/ListView_GetNextItem.htm
kenkenpo
質問者

お礼

さっそくのご回答ありがとうございます。 いつもお世話になりっぱなしですみません。 フォーカスが当たっていることと、選択されていることの違いが正直良く分かっていません。 最初に質問させていただいたことと若干変わってきてしまっているのですが、 アプリを立ち上げたとき、リストビューはまだどこも選択されていませんので、 エディットボックスに何か入力されたとしても、『変更』ボタンは有効にしたくないのです。 現在のプログラムですと、何か入力されると『変更』ボタンが有効になってしまいます。 ですので、そのとき、リストビューが選択状態にあるのか・ないのかを知りたいのです。 もしくは、最初質問させていただいたように、「リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、 エディットボックスが空欄では無いときに、『変更』ボタンを有効にする」という処理にしたいと思っています。 何どもお手数をおかけしてしまいますが、よろしくお願いいたします。

kenkenpo
質問者

補足

なんだか、難しく考えすぎていたのと、ListView_GetNextItem()のマクロをよく理解していなかったことが分かりました。 ListView_GetNextItem(hList, -1, LVNI_ALL | LVNI_SELECTED);の戻り値を判定するだけで、 選択されている行があるかはどうか分かりますね。 しかしまだ、フォーカスと選択の違いはわかりません。 『参考URL』、参考にさせていただきました。ありがとうございました。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★次の通知メッセージを処理。 ・『LVN_ITEMCHANGING』でリストビューのクリックを検出可能。  『LVN_ITEMCHANGED』でリストビューの選択項目が変化を検出可能。  両方とも WM_NOTIFY メッセージでキャッチしてクリック時に  ListView_GetNextItem() マクロで選択位置をチェックすれば良い。 ・これでご希望通りの動作を実装できると思います。  詳しい方法などをネット検索すればよい。  検索キーワードは『LVN_ITEMCHANGING』とか『WM_NOTIFY』とかで行うと良い。 その他: ・リストビューでは複数行を選択可能ですのでその選択状態とフォーカスの位置が  存在します。実際に『更新』、『削除』などのボタンを処理するときは選択状態  のほかにフォーカス位置を処理するようにしないとまずです。 ・選択状態を1行しか行わないように LVN_ITEMCHANGED を工夫すれば処理できます。  何もしないと複数の選択行がつきます。ListView_GetNextItem() マクロで検索するとき  『LVNI_SELECTED』以外にもフォーカス位置の『LVNI_FOCUSED』を追加して下さい。 ・以上。あとは頑張りましょう。

kenkenpo
質問者

お礼

いつも、お世話になっております。 目的の処理は実装できました。 そして、以前他の質問で教えていただいたリストビューのソートの処理も、無事実装することができました。 本当にありがとうございました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★追記。 ・アイテムの選択状態を設定/取得は  ListView_SetItemState( hWnd, nPos, data, mask );  ListView_GetItemState( hWnd, nPos, mask );  でも分かりますね。 サンプル: UINT uiState = ListView_GetItemState( hList, iItem, LVIS_SELECTED | LVIS_FOCUSED ); if ( uiState & LVIS_SELECTED ){  // 選択されている } else if( uiState & LVIS_FOCUSED ){  // フォーカスがある } else{  // 選択されていない } 以上。

kenkenpo
質問者

お礼

返答が遅くなってしまい大変申し訳ありません。 いつも、丁寧に分かりやすい回答をいていただきありがとうございます。 今回はある特定の行ではなく、リストビューのどこかの行が選択されているというイベントハンドラが あればと思っているのですが、そのようなものはあるのでしょうか。 ListView_GetItemStateの引数で、その設定は可能でしょうか。 また話は少し変わってしまうのですが、リストビューに項目を追加したときに、 その追加した行にフォーカスが合って、スクロールバーが自動的に下がってくるようにすることは可能でしょうか。 よろしくお願いいたします。

kenkenpo
質問者

補足

後者は、以下のマクロを使うことで解決しました。 ListView_EnsureVisible(hList, nItem, FALSE); どうもお騒がせいたしました。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★次のマクロをどうぞ。 ・UINT ListView_GetSelectedCount( HWND hWnd );  リスト ビュー コントロールで選択されているアイテム数を取得します。  http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_mfc_CListCtrl.3a3a.GetSelectedCount.asp ・UINT ListView_GetSelectedColumn( HWND hWnd );  リスト コントロールで現在選択されている列のインデックスを取得します。  http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/vclrfCListCtrlGetSelectedColumn.asp ・あとリストビューのマクロ関数は『CommCtrl.h』に定義されています。  なのでエディタで開いて『ListView_XXXX』の行を一度、抽出しておけば便利です。  あるいはメモ程度に何処か(ヘッダ,ソース,関連ファイル)に記述しておく。 ・以上。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_mfc_CListCtrl.3a3a.GetSelectedCount.asp

関連するQ&A