リストボックス選択

[戻る]
makoto 2002/07/31(水) 18:14:35
こんにちは。

今、MFCでプログラムを作っています。
ボタンを押したときに
リスト内の選択表示(グレー)を移動させています。
例えばリストの1行目が選択されていて
ボタンを押せば2行目に移るという感じです。

それと同時に選択されている行の内容を
テキストボックスに表示したいのです。

今はリストのITEMCHANGED関数の中に
テキストボックスへ表示させるコードを書いています。
リストの行を直接クリックしたときは、問題なく表示できていますが、
ボタンを押してリストを移動した場合は表示してくれません。

リストの行の選択状態は
SetItemState(index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
で実現させています。

これではITEMCHANGED関数はひろってくれないのでしょうか?
アドバイスをよろしくお願いします。

wood 2002/08/01(木) 06:17:26
ユーザーのオペレーション介入では無いようなので拾ってくれないと思われます
プログラム内で選択位置を変更してあげている分けですよね

>ボタンを押してリストを移動した場合
自分で値を取得しなければならないと思いますけど

>ITEMCHANGED
を引き起こすためのトリガとなるWMメッセージは何に当たるのか
SPYなどで調べてみてはどうでしょうか
わかったらそれをPOSTすれば良いかと思いますけど

実際やってないので 思う案だけの回答としました

dairygoods 2002/08/01(木) 10:20:53
SetItemState()を呼び出した場合も
実際に状態が変化した時に限り、LVN_ITEMCHANGEDが発生します。

「ボタンを押したときに次の行を選択する」という処理は
正しくできているのでしょうか?

makoto 2002/08/01(木) 10:34:49
アドバイスありがとうございます。

>「ボタンを押したときに次の行を選択する」という処理は
>正しくできているのでしょうか?

はい。
これはちゃんとできています。
ボタンを押すと次の行へフォーカス(グレー表示)が移動しています。
グレー表示が移動してもテキストボックスの中味は
変わってくれません。

SetItemState()でもITEMCHANGEDは呼び出せるのですか?

K.N 2002/08/01(木) 11:24:29
直接呼びだすと、なにか不都合があるのでしょうか?

はずしているかも...

void C***Dlg::OnButton1() 
{
 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
 CListBox *pLST = (CListBox*)GetDlgItem (IDC_LIST1);

 pLST->SetCurSel (3);
 OnSelchangeList1() ;    //ここ
}
void C***Dlg::OnSelchangeList1() 
{
 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
 CListBox *pLST = (CListBox*)GetDlgItem (IDC_LIST1);
 int    nPOS = pLST->GetCurSel();

 CString    STR;

 pLST->GetText(nPOS, STR);

 m_EDIT1 = STR;
 UpdateData (FALSE);
}

dairygoods 2002/08/01(木) 11:29:14
LVN_ITEMCHANGEDイベント関数内にブレークポイントを設定し、
SetItemState()を呼び出した後、関数が呼ばれているか、
または、余分な呼び出しがないか、確認していますか?

makoto 2002/08/01(木) 11:54:54
K.Nさん

すみません。
タイトルにリストボックスと書いていますが
私が使用しているのはリストビューみたいです。
OnSelchangeList1はリストボックスで使用できるものですよね。
他の人のPGを引き継いだので細かいところまで
チェックできていませんでした。


dairygoods さん

えっと、デバックなんですがうまくいきません。
ブレークポイントを設定すると
「1つ以上のブレークポイントが設定できませんでした
これらのブレークポイントは無効です」
というエラーがでます。
デバック用の設定か何かあるのでしょうか?

K.N 2002/08/01(木) 11:55:16
タイトルが リストボックス選択 なので
LISTBOX と間違いました 
リストコントロールなのですネ。
失礼しました。m(__)m

sugar 2002/08/01(木) 12:01:34
[Alt]+[F9]で、設定されているブレークポイントの設定個所が一覧できます。
全部消して、必要な個所だけ設定しなおしてみるとよいかも。

makoto 2002/08/01(木) 13:10:20
一度ブレークポイントを全てはずして
ブレークポイントを設定しないで実行した場合
普通に動きます。
ブレークポイントを1つ設定すると
上記と同じエラーメッセージがでてしまいました。

sugar 2002/08/01(木) 15:27:09
ワークスペースに複数のプロジェクトがある場合、
アクティブではないプロジェクトのプログラム中に
アクティブなブレークポイントがあると、勝手に無効にされるようです。

dairygoods 2002/08/01(木) 15:42:09
Releaseビルドを使用しているということはないですよね…?

それはともかく、
先の書き込みでは、ようするに、
SetItemState()を呼び出したときに、
本当にLVN_ITEMCHANGEDハンドラが
呼び出されていないのか確認したかっただけですので、
メッセージボックスでもファイル出力でも構いません。

makoto 2002/08/01(木) 15:54:50
[[解決]]
デバックはやっぱりうまくいかないので
メッセージボックスで試してみました。
結果はちゃんとITEMCHANGEDを呼び出していました。

なのでITEMCHANGEDの中のコードがおかしいのかも。
コードを少し見直してみます。

アドバイスありがとうございました。

古いスレッドには追加発言できません。