リストボックス選択 – プログラミング – Home

通知
すべてクリア

[解決済] リストボックス選択


makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

こんにちは。

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

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

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

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

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


引用未解決
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

SetItemState()を呼び出した場合も
実際に状態が変化した時に限り、LVN_ITEMCHANGEDが発生します。

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


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

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

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

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

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


返信引用
K.N
 K.N
(@K.N)
ゲスト
結合: 23年前
投稿: 14
 

直接呼びだすと、なにか不都合があるのでしょうか?

はずしているかも...

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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

K.Nさん

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

dairygoods さん

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


返信引用
K.N
 K.N
(@K.N)
ゲスト
結合: 23年前
投稿: 14
 

タイトルが リストボックス選択 なので
LISTBOX と間違いました
リストコントロールなのですネ。
失礼しました。m(__)m


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

ワークスペースに複数のプロジェクトがある場合、
アクティブではないプロジェクトのプログラム中に
アクティブなブレークポイントがあると、勝手に無効にされるようです。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

Releaseビルドを使用しているということはないですよね…?

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


返信引用
makoto
 makoto
(@makoto)
ゲスト
結合: 23年前
投稿: 50
Topic starter  

デバックはやっぱりうまくいかないので
メッセージボックスで試してみました。
結果はちゃんとITEMCHANGEDを呼び出していました。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました