リストボックスの内容を設定するには(設定はできるのすが、タイミングが・・)


ばとー  2005-12-25 23:38:18  No: 60048

よろしくお願いします。

WindowsXP, eVC++3.0, WindowsCE3.0, MFC, ダイアログベースで
ハンディターミナルの開発をしています。

コンボボックス1(得意先)とリストボックス1(明細)があります。
コンボボックス1で選択した条件で、リストボックス1の内容をセットして、表示させたいんです。

この時、コンボボックス1のリストから選択した時点で、リストボックス1を表示させようと思うのですが、表示されません。
選択してから、Enterキー/下キーを押すと表示されます。

ソースはこんな感じです。

switch (pMsg->message){
case WM_KEYDOWN:
  CComboBox* pmyComboBox1=(CComboBox*)GetDlgItem(IDC_COMBO_TOKCD);     case VK_RETURN:
    if (::GetParent(pMsg->hwnd) == GetDlgItem(IDC_COMBO_TOKS)->m_hWnd) {
       toksCheck();  
       return true;
    }
    return true;
    break;
  }
  return false;
  break;
}

void CSnshDlg::OnSelendokComboToks() 
{

  toksCheck();  

}

void CSnshDlg::toksCheck()
{
   CString check_toks
   CComboBox* pmyComboBox1=(CComboBox*)GetDlgItem(IDC_COMBO_TOKS);
   CListBox* pmyListBox1=(CListBox*)GetDlgItem(IDC_LIST_MEISAI);
   pmyComboBox1->GetWindowText(check_toks);

   //////////////////

   テキストファイルから条件あう明細のみ、リストボックスにセットする処理

   //////////////////

}

わかりにくい説明だと思いますが、よろしくお願いします。


RAPT  2005-12-26 04:39:31  No: 60049

タイミングとしては、WM_COMMAND で LBN_SELCHANGE が送られたとき、
がご希望のタイミングでしょうか?


PATIO  2005-12-26 22:47:36  No: 60050

今のソースを見る限りだと書いたとおりの動作をしていますよとしか言えません。
で、今のソースで出来ると思っているのだけれど自分が意図した動作をしないのか、
取り敢えずこう書くとこういう動きになるのだけれど、どういうウインドウメッセージで
処理していいのか分からないので該当するメッセージを教えてほしいのか、
どちらなんでしょう?
その辺はストレートに書く様にした方が話が一発で通るのでレスも的確につきますよ。
多分、RAPTさんのレスで解決しそうな気がしますけれど。


ばとー  2005-12-27 02:56:51  No: 60051

みなさんありがとうございます。

説明不足と説明を簡単にしようと省きすぎました。
無駄な手間をとらせてしまいました。ごめんなさい。

コンボボックス1の内容は、コードと得意先名です。
そして、2種類の選択が出来るようにしています。
1.リストから選択する。
2.コードを入力する。

2の場合
[001000 サンプル商店]という得意先があった場合、
[001000][1000]どちらで入力しても、[001000 サンプル商店]が表示されます。

実際のソースは、こんな感じです。
switch (pMsg->message){
case WM_KEYDOWN:
  CComboBox* pmyComboBox1=(CComboBox*)GetDlgItem(IDC_COMBO_TOKCD);       case VK_RETURN:
    if (::GetParent(pMsg->hwnd) == GetDlgItem(IDC_COMBO_TOKS)->m_hWnd) {
       toksCheck();    
       return true;
    }
    return true;
    break;
  }
  return false;
  break;
}

void CSnshDlg::OnSelendokComboToks() 
{
  toksCheck();    
}

void CSnshDlg::toksCheck()
{
   CString check_toks,a;
   int nIndex = 0;
   CComboBox* pmyComboBox1=(CComboBox*)GetDlgItem(IDC_COMBO_TOKS);
   pmyComboBox1->GetWindowText(check_toks);
   check_toks.Format(_T("%06d"), _ttoi(check_toks));
   check_toks += _T(":");

   a = check_toks.GetAt(6);
   if(a == ":" ){
      nIndex = pmyComboBox1->SelectString(-1, check_toks);
      if(nIndex != CB_ERR){
         MeisaiSet();
         m_list_meisai.SetFocus();
      }
   }
}

void CSnshDlg::MeisaiSet() 
{
   CString check_toks
   CComboBox* pmyComboBox1=(CComboBox*)GetDlgItem(IDC_COMBO_TOKS);
   CListBox* pmyListBox1=(CListBox*)GetDlgItem(IDC_LIST_MEISAI);
   pmyComboBox1->GetWindowText(check_toks);

   //////////////////

   テキストファイルから条件あう明細のみ、リストボックスにセットする処理

   //////////////////

}

やりたいことは、
コード入力後にEnterキー入力した時と、リストから選択した時に、
リストボックスに値を設定したいんです。
上のようにやると、コード入力後にEnterキー入力した時はうまく設定されるのですが、
リストから選択した時は、リストボックスに設定されません。

MSDNで[ON_CBN_SELENDOK   項目を選択後、Enter キーを入力するか、下向き矢印をクリックしてコンボ ボックスのリスト ボックスを非表示にしたときに通知されます。]とあったので、
両方いけるかなと思い、このメッセージで処理するようにしました。
こういう場合どのメッセージで処理すれば良いのでしょうか?

>タイミングとしては、WM_COMMAND で LBN_SELCHANGE が送られたとき、
これは、[リスト ボックスの選択が変更される直前に送られます。]とMSDNで、
書いてあったのですが、この時に設定するということでしょうか?
こっちの方ですか?
CBN_SELCHANGE  このメッセージも考えたのですが、コードを入力する時
1文字入力するたびに、このメッセージは送られるように思うんですが、
コードを[001000][1000]でも入力出来るようにしてるので、
入力を判定するうまい方法が出てこなくて。

手間をとらせてしまって、すみません。
勘違いして変なことをいっているかもしれませんが、
よろしくお願いします。


Toshi  2005-12-27 23:49:12  No: 60052

>MSDNで[ON_CBN_SELENDOK   項目を選択後、Enter キーを入力するか、下向き矢印をクリックしてコンボ ボックスのリスト ボックスを非表示にしたときに通知されます。]とあったので、

↑の意味を履き違えています。
通常コンボボックスは選択リストをドロップダウンさせ、
リストから項目を選択後右クリで選択を確定させますが、
ここで右クリでは無くてエンターで確定させた場合・・
と言う意味です。

もっと正確に言えば、その説明はマウス操作前提では無くて
キーボード操作前提です。キーボードでコンボボックスを
操作する際は、graph+カーソル↓でドロップダウンリストの
表示・非表示、カーソル↑↓で項目の選択、エンターで確定
です。

なので、項目を手入力で指定出来る様にする場合、一番楽なのは
KillFocus時に値を取得なのですが、どうしてもエンターで値を
取得する仕様が変えられないのならば、現状のWM_KEYDOWNでの
判定とCBN_SELCHANGEの判定を二つするしか無いんじゃないかと
思います。
尚、ON_CBN_SELCHANGEは手入力に反応しません。
手入力の1文字単位で反応するのは ON_CBN_EDITCHANGEとかです。

まぁ、この辺はサンプルプログラムをひとつこさえて
自分で動きを検証するのが一番手っ取り早いと思います。
可能で有れば、聞く前にやってみる事をお勧めします。


RAPT  2005-12-28 01:56:16  No: 60053

> LBN_SELCHANGE
あ、ごめんなさい、コンボボックスだから、CBN_SELCHANGEですね。
で、多分、SEL=CELLの勘違いかなーとか思いました。

CBN_SELCHANGE  のSELは、SELECTION の略なので、
ComboBoxNotify_SelectionChanges とか意訳すると吉です。

Selectなので、選択されていない=EDITBOX部分にキーボード入力時
にはこのメッセージは送られません。
(CBN_SELxxxx はドロップダウンリストを操作していないときには
  関係の無いメッセージです。)

MSDNを意訳すると、CBS_SIMPLE スタイルが設定されている場合、
すべてのCBN_SELCHANGEより先にCBN_SELENDOKが送られるとありますね。

で、コンボボックスは、リストボックスとエディットボックスとの
複合コントロールなので、リスト操作時とエディット操作時とで
別々の操作をハンドリングしたければ、それぞれ別のメッセージ
ハンドラを書く必要があります。

(余談)
キーボード入力確定時に、CB_FINDSTRING+CB_SETCURSELでリスト選択
させ、同時に発生するCBN_SELCHANGEでまとめて処理させるって方法も
あります。

# テストプログラムを作って、どんなときにどんなメッセージが
# 発生するか確認することは、大賛成。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加