ギリギリ行けるお一人様のライン

リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、エディットボックスが空欄では無いときに、
あるボタンを有効にするという処理をしたいと思っています。

リストビューが選択されていることを教えてくれるメッセージがあれば、教えてください。よろしくお願いします。

環境:Win32 API, VC++6.0

A 回答 (4件)

★アドバイス


>また話は少し変わってしまうのですが、リストビューに項目を追加したときに、
>その追加した行にフォーカスが合って、スクロールバーが自動的に下がってくるように
>することは可能でしょうか。
 ↑
 可能です。
 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/Lis …

この回答への補足

なんだか、難しく考えすぎていたのと、ListView_GetNextItem()のマクロをよく理解していなかったことが分かりました。

ListView_GetNextItem(hList, -1, LVNI_ALL | LVNI_SELECTED);の戻り値を判定するだけで、
選択されている行があるかはどうか分かりますね。

しかしまだ、フォーカスと選択の違いはわかりません。

『参考URL』、参考にさせていただきました。ありがとうございました。

補足日時:2007/08/06 15:01
    • good
    • 0
この回答へのお礼

さっそくのご回答ありがとうございます。
いつもお世話になりっぱなしですみません。

フォーカスが当たっていることと、選択されていることの違いが正直良く分かっていません。

最初に質問させていただいたことと若干変わってきてしまっているのですが、
アプリを立ち上げたとき、リストビューはまだどこも選択されていませんので、
エディットボックスに何か入力されたとしても、『変更』ボタンは有効にしたくないのです。
現在のプログラムですと、何か入力されると『変更』ボタンが有効になってしまいます。
ですので、そのとき、リストビューが選択状態にあるのか・ないのかを知りたいのです。

もしくは、最初質問させていただいたように、「リストビューが選択状態(1行が青色や灰色の背景になる状態)にあって、
エディットボックスが空欄では無いときに、『変更』ボタンを有効にする」という処理にしたいと思っています。

何どもお手数をおかけしてしまいますが、よろしくお願いいたします。

お礼日時:2007/08/06 11:34

★次の通知メッセージを処理。


・『LVN_ITEMCHANGING』でリストビューのクリックを検出可能。
 『LVN_ITEMCHANGED』でリストビューの選択項目が変化を検出可能。
 両方とも WM_NOTIFY メッセージでキャッチしてクリック時に
 ListView_GetNextItem() マクロで選択位置をチェックすれば良い。
・これでご希望通りの動作を実装できると思います。
 詳しい方法などをネット検索すればよい。
 検索キーワードは『LVN_ITEMCHANGING』とか『WM_NOTIFY』とかで行うと良い。

その他:
・リストビューでは複数行を選択可能ですのでその選択状態とフォーカスの位置が
 存在します。実際に『更新』、『削除』などのボタンを処理するときは選択状態
 のほかにフォーカス位置を処理するようにしないとまずです。
・選択状態を1行しか行わないように LVN_ITEMCHANGED を工夫すれば処理できます。
 何もしないと複数の選択行がつきます。ListView_GetNextItem() マクロで検索するとき
 『LVNI_SELECTED』以外にもフォーカス位置の『LVNI_FOCUSED』を追加して下さい。
・以上。あとは頑張りましょう。
    • good
    • 0
この回答へのお礼

いつも、お世話になっております。
目的の処理は実装できました。

そして、以前他の質問で教えていただいたリストビューのソートの処理も、無事実装することができました。

本当にありがとうございました。

お礼日時:2007/08/09 11:54

★追記。


・アイテムの選択状態を設定/取得は
 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{
 // 選択されていない
}

以上。

この回答への補足

後者は、以下のマクロを使うことで解決しました。

ListView_EnsureVisible(hList, nItem, FALSE);

どうもお騒がせいたしました。

補足日時:2007/08/06 10:46
    • good
    • 0
この回答へのお礼

返答が遅くなってしまい大変申し訳ありません。
いつも、丁寧に分かりやすい回答をいていただきありがとうございます。

今回はある特定の行ではなく、リストビューのどこかの行が選択されているというイベントハンドラが
あればと思っているのですが、そのようなものはあるのでしょうか。
ListView_GetItemStateの引数で、その設定は可能でしょうか。

また話は少し変わってしまうのですが、リストビューに項目を追加したときに、
その追加した行にフォーカスが合って、スクロールバーが自動的に下がってくるようにすることは可能でしょうか。

よろしくお願いいたします。

お礼日時:2007/08/06 09:42

★次のマクロをどうぞ。


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

参考URL:http://msdn.microsoft.com/library/ja/default.asp …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A