• 締切済み

コンボボックスのエディットでキー操作するには

コンボボックスのメンバコントロールCEditでエンターを押した時、 何か処理をさせたい場合はどうすればいいのでしょうか? class CEditEX :public CEdit{ virtual BOOL PreTranslateMessage(MSG* pMsg){ if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN) ){ TRACE("TEST\n");} return 0;} } }; CComboBox m_ComboBox; CEditEX m_EditEX; m_ComboBox.m_pWndEdit = m_EditEX; こうしたいのですが、pWndEdit がprotectedな為できません。 コンボボックスのエディット入力キーメッセージが上位ウィンドウに送られて来ることはないんでしょうか? コンボボックスでキーが押されたときに実行されるオーバーライド可能な関数はないのでしょうか? どうすればいいのか教えてください。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

m_ComboBoxの子コントロールのエディットボックスは CWnd* pWnd = NULL; pWnd = m_ComboBox.GetWindow( GW_CHILD ); または CRect rc; m_ComboBox.GetClientRect( &rc ); pWnd = m_ComboBox.ChildWindowFromPoint( rc.CenterPoint() ); といった具合で取得できます これを使って コンボボックスの親のPreTranslateMessageで if ( pWnd != NULL ) {   if ( pMsg->message == WM_KEYDOWN ) {     if ( pMsg->hwnd = pWnd->m_hWnd ) {       if ( pMsg->wParam == VK_RETURN ) {         TRACE( "TEST\n" );       }     }   } } といった具合で行えばいいのではないかと思います

_jast
質問者

補足

ありがとうございます。 エンターキーを押した時、親にWM_KEYDOWNが届きません。 これはコンボボックスで、VK_RETURNをスルーさせているからなのでしょうか? これを書き換える方法はありませんか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エディットボックス

    VC++、APIでwindowsプログラムを書いています。ダイアログボックスで質問があります。 case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT1, "0"); return TRUE; で読み取り専用エディットボックス内に初期値を書き case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam ; SetTextColor( hdc, RGB( 255, 255, 255)) ;// 白色 SetBkMode(hdc, TRANSPARENT); // 背景を透過 return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ; } でダイアログボックス内のスタティックテキストと読み取り専用エディットボックスの背景を同時に透過させているのですが、エディットボックス内の文字を void ddd( HWND hDlg, int xxx) { char ttt[100]; sprintf(ttt,"%d",xxx); SetDlgItemText(hDlg, IDC_EDIT1, ttt); return ; } で書き換えると古いテキストが残ったように表示されます(背景に色を指定すれば古いテキストは残らない)。 うまく表示させるにはどういった方法があるでしょうか? ご存知の方、よろしくお願いします。 ちなみにダイアログボックスにはビットマップが貼ってあります。

  • ドロップダウン エディット コンボボックスの使い方

    Excel for Mac 2011の開発にて 「ドロップダウン エディット コンボボックス」 を使用したいのですが、表示が灰色で選択できません。 「コンボボックス」 も試してみたのですが、入力方法がドラッグのみの対応だったので、 ドロップダウン形式のコンボボックスを使用したいと考えているのですが、 この機能を利用するにはどうすれば良いのでしょうか? 可能であればVBA上での関数名なども併せてご教示願えますと幸いです。 (通常のコンボボックスと同様に「ComboBox1」で良いのでしょうか?)

  • エディットボックスでテキストの最後に入力したい?

    エディットボックスで最後の位置に ( が入力されたときに閉じ括弧の ) を出力して () としたいのです が、下のコードだと ( が入ったときに )( となってしまいます。いろいろ試していますが () と出力 できないので、わかる方よろしくお願いします。 int nStartChar, nEndChar; CEdit *edit1 = (CEdit *) GetDlgItem(IDC_EDIT1); if(pMsg->message == WM_CHAR) if(pMsg->wParam == '(') { edit1->GetSel(nStartChar, nEndChar); edit1->SetSel(nStartChar, nEndChar); edit1->ReplaceSel(")"); }

  • エディットボックス内でキー押されたときのメッセージ

    VC++6.0です。 メインウインドウ内のエディットボックス(一行)で、特定のキー入力を検知したいのですが、どのようにすればよいでしょうか。 mfcは使ってません。 //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {  switch( message )  {   case WM_CREATE:    //エディットボックスを作成    CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT","",          WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL,          0,0,2000, 20, hWnd, (HMENU)IDC_EDIT, g_hInst, NULL );    break;   case WM_COMMAND:    //エディットボックス内の変更はEN_CHANGEで受け取れるが、    //キーコードは送られてこない    break;  } }

  • キーコードとAltキー

    矢印キーのVK_UPが押された時、Altキーも押されているかを調べたいのですが、どうしたらよいですか? DLLはできるだけ使いたくありません。 case WM_KEYDOWN:  if(wParam == VK_UP){   if(Alt){   }  }

  • テキストボックスからフォーカス外す

     editBox = CreateWindow(   "EDIT",   "あああ",   SS_CENTER | WS_CHILD | WS_VISIBLE,   0,0,100,20,   hWnd,   NULL,   hInstance,   NULL); テキストボックスのフォーカスを外すにはどうしたら いいんですか? ESCキーでフォーカスを外そうと思ったら、 テキストボックスにフォーカスがあるせいで case WM_KEYDOWN が動作しません。 フォーカスを外すというソース自体も分かっていません。  case WM_KEYDOWN:   if( wParam == VK_ESCAPE )    ?  break;

  • Formにエディットボックスを貼りたい

    環境はWIN98 VC++6.0 MFC SDIです。 クラスウィザードのデフォルトでSDIを作ります。 但し、6/6ページの基本クラスはCFormViewにします。 このForm上にプログラム上からエディットボックスを貼りつけるために、以下のようにしましたが、エディットボックスらしき白い四角は出来ましたが文字の入力が出来ません。 どうすればよいのでしょうか? static contID = 4000; ///////////////////////////////////////////////// int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略   CRect rect;   // CTestWndの上にCEditを貼り付ける   rect.top = 30;   rect.left = 30;   rect.bottom = 100;   rect.right = 100;   CEdit* edit = new CEdit();      if( edit->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,   rect,   this,   contID++ ) != TRUE ){     throw new CException();   }   return 0; }

  • MFCでのコンボボックスについて

    ご教授願いたくよろしくお願いします。 初歩的な質問ですみません。 何度やっても表示されません。 開発環境 OS:WindowsXP PP:VC++ 6.0 MFC 使用 質問 コンボボックスの初期値として、"F3"という文字を コンボボックスのテキストに表示させたいのです。 コンボボックスのリストから選択した項目の文字列を表示させたいのですが、できません。 コンボボックスのプロパティとしては、 タイプ:ドロップダウン オーナー描画:いいえ 初期描画で使用しているロジックとしては、 CString sss; m_cmb1.GetLBText(0, sss); m_cmb1.SetWindowText(sss); UpdateData(FALSE); ※m_cmb1は、CComboBox の変数です。 参考になるURLやロジックをお願いします!

  • WM_KEYDOWNでPrtScを捕まえる方法??

    ごく普通のウィンドウプロシージャでキーの判別を行っています 下記のように条件(1)が WM_KEYUP の際には(2)、(3)ともに検出します LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_KEYUP: ............ (1) switch(wp) { case VK_RETURN: { break; } ..... (2) case VK_SNAPSHOT: { break; } ..... (3) default: { break; } } break; } return; ところが条件(1)を WM_KEYDOWN に変更すると(2)の Enter は検出しますが、(3)の PrtSc を検出してくれません 質問1 なぜ PrtSc を WM_KEYDOWN では検出しないのですか? 質問2 WM_KEYUP WM_KEYDOWN のいずれか一方にしか反応しないキーはまだありますか? 質問3 どのようにしたら PrtSc の WM_KEYDOWN を捕まえることが出来ますか? 自分でも調べてみましたが、どうも判然と致しません 宜しくご指導のほどお願い申し上げます

  • テキストボックスのデフォルト設定とコンボボックスの更新について

    テキストボックスのデフォルト設定とコンボボックスの更新について エクセルのVBAで、ユーザーフォームを使用しています。 ユーザーフォームの中にはコンボボックスとテキストボックスとボタンがあります。 コンボボックスには「ABCDEFGHIJKLM」と合計13のリストがあります。 ユーザーフォーム起動時に、コンボボックスには最初のリスト(A)が表示 されていて、「次へ」ボタンと「戻る」ボタンの2つを用意しています。 (1)ユーザーフォーム起動時にテキストボックスに「0」を入れる方法を教えていただけないでしょうか。 コンボボックスで「A」が選択された状態で「次へ」ボタンをおしたら「B」が選ばれる。 「D」が選択された状態で「次へ」ボタンをおしたら「E」が選ばれる。 「M」が選択された状態で「次へ」ボタンをおしたら「A」が選択される。(リストの最初に戻る。) というのは、次のVBAで上手くいきました。 If Combobox1.ListIndex < Combobox1.ListCount - 1 Then Combobox1.Text = Combobox1.List(Combobox1.ListIndex + 1) Else Combobox1.Text = Combobox1.List(0) End If (2)しかし「E」が選択された状態で「戻る」ボタンをおしたら「D」が選ばれる。 「G」が選択された状態で「戻る」ボタンをおしたら「F」が選ばれる。 「A」が選択された状態で「戻る」ボタンをおしたら「M」が選ばれる。(リストの最後に戻る。) といった内容のマクロがうまく組めません。 教えていただけると助かります。