こんにちは。
今、MFCでプログラムを作っています。
ボタンを押したときに
リスト内の選択表示(グレー)を移動させています。
例えばリストの1行目が選択されていて
ボタンを押せば2行目に移るという感じです。
それと同時に選択されている行の内容を
テキストボックスに表示したいのです。
今はリストのITEMCHANGED関数の中に
テキストボックスへ表示させるコードを書いています。
リストの行を直接クリックしたときは、問題なく表示できていますが、
ボタンを押してリストを移動した場合は表示してくれません。
リストの行の選択状態は
SetItemState(index, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
で実現させています。
これではITEMCHANGED関数はひろってくれないのでしょうか?
アドバイスをよろしくお願いします。
ユーザーのオペレーション介入では無いようなので拾ってくれないと思われます
プログラム内で選択位置を変更してあげている分けですよね
>ボタンを押してリストを移動した場合
自分で値を取得しなければならないと思いますけど
>ITEMCHANGED
を引き起こすためのトリガとなるWMメッセージは何に当たるのか
SPYなどで調べてみてはどうでしょうか
わかったらそれをPOSTすれば良いかと思いますけど
実際やってないので 思う案だけの回答としました
SetItemState()を呼び出した場合も
実際に状態が変化した時に限り、LVN_ITEMCHANGEDが発生します。
「ボタンを押したときに次の行を選択する」という処理は
正しくできているのでしょうか?
アドバイスありがとうございます。
>「ボタンを押したときに次の行を選択する」という処理は
>正しくできているのでしょうか?
はい。
これはちゃんとできています。
ボタンを押すと次の行へフォーカス(グレー表示)が移動しています。
グレー表示が移動してもテキストボックスの中味は
変わってくれません。
SetItemState()でもITEMCHANGEDは呼び出せるのですか?
直接呼びだすと、なにか不都合があるのでしょうか?
はずしているかも...
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);
}
LVN_ITEMCHANGEDイベント関数内にブレークポイントを設定し、
SetItemState()を呼び出した後、関数が呼ばれているか、
または、余分な呼び出しがないか、確認していますか?
K.Nさん
すみません。
タイトルにリストボックスと書いていますが
私が使用しているのはリストビューみたいです。
OnSelchangeList1はリストボックスで使用できるものですよね。
他の人のPGを引き継いだので細かいところまで
チェックできていませんでした。
dairygoods さん
えっと、デバックなんですがうまくいきません。
ブレークポイントを設定すると
「1つ以上のブレークポイントが設定できませんでした
これらのブレークポイントは無効です」
というエラーがでます。
デバック用の設定か何かあるのでしょうか?
タイトルが リストボックス選択 なので
LISTBOX と間違いました
リストコントロールなのですネ。
失礼しました。m(__)m
[Alt]+[F9]で、設定されているブレークポイントの設定個所が一覧できます。
全部消して、必要な個所だけ設定しなおしてみるとよいかも。
一度ブレークポイントを全てはずして
ブレークポイントを設定しないで実行した場合
普通に動きます。
ブレークポイントを1つ設定すると
上記と同じエラーメッセージがでてしまいました。
ワークスペースに複数のプロジェクトがある場合、
アクティブではないプロジェクトのプログラム中に
アクティブなブレークポイントがあると、勝手に無効にされるようです。
Releaseビルドを使用しているということはないですよね…?
それはともかく、
先の書き込みでは、ようするに、
SetItemState()を呼び出したときに、
本当にLVN_ITEMCHANGEDハンドラが
呼び出されていないのか確認したかっただけですので、
メッセージボックスでもファイル出力でも構いません。
デバックはやっぱりうまくいかないので
メッセージボックスで試してみました。
結果はちゃんとITEMCHANGEDを呼び出していました。
なのでITEMCHANGEDの中のコードがおかしいのかも。
コードを少し見直してみます。
アドバイスありがとうございました。