コンボボックスでEnterキーが押下されたか調べるには

解決


ばとー  2005-11-24 22:16:18  No: 59774

よろしくおねがいします。

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

コンボボックスで、下記のようなデータがリストにあった場合、
01:バラ
02:ケース
03:キロ

1:リストから選択するのと、[01:バラ]が表示される。
2:"01"と入力すると[01:バラ]が、表示される。
というような、2通りで選択したいんです。

現在、PreTranslateMessageで、キーが押下された時に、
どこにフォーカスがあるか調べて、
それによって処理をしています。
エディットボックスならうまくいくのですが、
コンボボックスだとうまくいきません。

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
{
  int ret;
  switch (pMsg->message)
  {
  case WM_KEYDOWN:
    switch (pMsg->wParam)
    {
    case VK_RETURN:
      if (GetFocus() == GetDlgItem(IDC_DTP_NOUHIN)){ //日付時間
        m_edit_tokcd.SetFocus(); return true;
      }
      if (GetFocus() == GetDlgItem(IDC_EDIT_TOKCD)){ //エディット
        tokcdCheck(); return true;
      }
      if (GetFocus() == GetDlgItem(IDC_EDIT_KUBUN)){  //エディット
        kubunCheck(); return true;
      }
      if (GetFocus() == GetDlgItem(IDC_COMBO_HANTANI)){ //コンボ
        hantaniCheck(); return true;
      }

      //MessageBox(_T("test"), _T("test"), MB_OK);

      return true;
      break;
    }
  }

  return CDialog::PreTranslateMessage(pMsg);
}

void CTestDlg::hantaniCheck()
{
  CString check_hantani;
  int nIndex = 0;

  CComboBox* pmyComboBox1=(CComboBox*)GetDlgItem(IDC_COMBO_HANTANI);
  pmyComboBox1->GetWindowText(check_hantani);
  check_hantani += _T(":");
  nIndex = pmyComboBox1->SelectString(0, check_hantani);
}

IDC_DTP_NOUHINだとフォーカスが移動してくれます。
IDC_EDIT_TOKCDだとtokcdCheck()が実行されます。

IDC_COMBO_HANTANIだとhantaniCheck()を実行してくれません。
コンボボックスにフォーカスがあるか
判定してくれてない感じです。

ちなみに、
//MessageBox(_T("test"), _T("test"), MB_OK);のコメントをはずして、
コンボボックスでEnterキーを押した場合、メッセージが表示されます。

コンボボックスは、なにか違うことがあるのでしょうか?
ながながと書きましたが、よろしくお願いします。


Toshi  2005-11-24 23:35:48  No: 59775

コンボボックスって確か単純なコントロールじゃなかった様な・・
今は eVC環境が無いので余り細かい事は言えないのですが、
取りあえず通常のMSDNで CComboBoxのクラス概要を見てもらえば分かるとおり、
WM_KEYDOWN でなんかやろうと思ったら、エディットコントロールを取得して操作してやらないとダメだと思います。
エンターをキックにしなくて良いなら、別のアプローチで行った方が面倒が無くて良いと思います。
(例えば、01と入力された時点若しくは:をキックにデータを固定して良いなら・・・)


  2005-11-25 01:09:59  No: 59776

if(::GetParent(pMsg->hwnd) == GetDlgItem(IDC_COMBO1)->m_hWnd) {

こんなのとか


ばとー  2005-11-26 01:31:51  No: 59777

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

Toshiさん
>エンターをキックにしなくて良いなら、別のアプローチで行った方が面倒が無くて良いと思います。
>(例えば、01と入力された時点若しくは:をキックにデータを固定して良いなら・・・)
一応ほかの方法でやろうと思い、コンボボックスのエディットボックス部分の変更があった時に、
内容を見て数字2桁だったら、SelectStringで選択させるようにしたら、うまくいきました。
OKと思っていたら・・・他のキーも判定したかったんです、んーどうしょって感じでした。
(こんな方法のことだったんでしょうか?)

そこで、とさん
>if(::GetParent(pMsg->hwnd) == GetDlgItem(IDC_COMBO1)->m_hWnd) {
でやってみたらできました。おーすごい。

みなさんの、アドバイスのおかげでできました。
感謝感謝です。
ありがとうございます。


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

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






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