• ベストアンサー

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

リストビューが選択状態(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

  • VC++リストビューで選択されている色の変更

    リストビューで表示スタイルをレポートにしています。 で、マウスなどでクリックすると当然のごとく青色に選択され、別のウィンドウをクリックすると灰色になるのですが、この青色と灰色両方の色を変えたいのですがどうしたらよいでしょうか?よろしくお願いします。

  • ダイアログのコントロールじゃない場所のクリックを検出したい。

    VC++6.0、Win32 APIでダイアログボックスを作っています。 ダイアログボックス上のラジオボタンでもリストビューでもエディットボックスでもなくて、 何にもないところをクリックしたときに、そのクリックを検出することはできますか。 教えてください。

  • リストビューで最初に選択されたインデックスを取得したい

    リストビューについて質問いたします VC++5.0 & SDK で作成しています リストビューで最初に選択されたものを取得したいのですが (その選択がはずされれば次に選択されていたもの) GetFirstSelectedItemPositionはそれに相当するメッセージが 見当たらないのでSDKでは使えないようですが 何か良い方法はありませんでしょうか? よろしくお願いいたします

  • 自作ダイアログボックス中のエディットボックスでCtrl+Aを使えるようにしたい。

    リソースエディタで作成したダイアログボックスの中のエディットボックスで、 Ctrl+Aで全範囲選択をしたいのですが実現方法が分かりません。 同様に、リストビューの選択行を「Delキー」で削除させる方法も教えていただきたいです。 (削除ボタンを作成し、その押下によって削除できるようにはなっています。) 環境は、VC++ 6.0、Win32 APIです。 よろしくお願い致します。

  • 空のリストビューで1行おきに背景色を変える

    リストビューで1行おきに背景色を変えたくて、 http://homepage3.nifty.com/mitui707/VisualC/VClistview_color.html/ を参考にさせて貰らい、データを次々に追加していくと、サンプル通りに5行目の背景色と文字色は変わりました。 が、起動時の何もデータが無い状態の空のリストビューで1行おきに背景色を変えたいのです。 色々と試してますが、まだ初心者のため間違っているのかうまくいきません。 どなたか助言をお願いします。 VC++6.0を使用しています。

  • リストビュー、ツリービューの選択時の色がなくなる(XP)

    Becky、OutlookExpressなどの複数のソフトで、ツリービュー(Outlookの左側のコンポーネント)、リストビュー(Outlookの右下側のコンポーネント)に関し、次の症状で困ってます。 ・フォーカスがあるときは背景色が青で、通常どおりどれが選択されているかわかる ・フォーカスを他のコントロールに移動させると、背景色が薄い灰色となり、目をよほど凝らしてみないとどれが選択されているかわからない ・上記症状のでるPCで、画面のスタイルをXPスタイル(標準)からWindows2000スタイルにすると上記症状はなくなり、非選択状態でもどれが選択されているかわかるようになる。詳細設定をいろいろいじりましたが、解決できませんでした ・上記状態は、Windows2000マシンでは発生せず、XP固有の問題だと考えられます Windows200スタイルにしてしまえば解決するのはわかりますが、プログラムの開発をしている関係上、XP標準状態のままでいたいと思ってます。 よろしくお願いします

  • リストビューコントロールのアイテム選択

    リストビューコントロールのViewプロパティを3lvw_Reportにしてクリックすると、アイテムが選択されますが、SubItem(1)など、サブアイテムが選択されたいないので、見た目がわるいです。 クリックしたときに全サブアイテムを横一直線に選択したいのです。 APIを使って何とかできそうな気がしたので調べたのですが、わかりませんでした。 どなたか教えてください。

  • エディットボックスの処理で画面がちらつきます。

    VC++ 6.0 Win32APIにてダイアログベースのプログラムを作成しております。 ダイアログに18個のエディットボックスを配置しておりますが、そのエディットボックスのテキストを SetDlgItemText()を使って全て空欄にすると(第3引数に””を指定)画面がちらつきます。 同ダイアログ内のリストコントロールがダブルクリックされた際のイベントを拾ってエディットボックスクリアの処理を実行しているのですが、ちらつきを抑える手法はありますでしょうか?

  • リストボックスの1行目を選択状態にする

    リストボックス 何も選択していないのなら、1行目を選択状態にする というようにするにはどうすればいいでしょうか? 今は無理やり Sub test() If IsNull(Sheets("Sheet2").ListBox1.Value) = True Then Sheets("Sheet2").ListBox1.Value = "a" End If End Sub としていますが、 「リストボックスの1行目を選択状態にする」 にはどうすればいいですか? リストボックスがどの業も選択してない時に、 画像のようにしたいです。

  • リストボックスの選択解除

    VBAでフォーム上にリストボックスを置いています。 最初にフォームを表示した時は 何もリストボックスが選択されておらず 値を追加した後に、何かクリックすると 選択した項目が青?色に変わります。 その青色を解除したいのですが(要は選択状態を解除したい) どうやってすればいいのでしょうか? selected(X) = falseとしましたが何も起こりませんでした。 宜しくお願い致します。

専門家に質問してみよう