エディットコントロールのイベントハンドラについて

このQ&Aのポイント
  • CEditの派生クラスを作成し、その派生クラスを使用するダイアログでEN_CHANGEイベントが捕捉できない問題が発生しました。
  • 質問者は、どうすればキャッチできるようになるかアドバイスしてほしいとしています。
  • エディットコントロールに文字を入力すると(1)の処理には来るが、(2)の処理には来ないとのことです。
回答を見る
  • ベストアンサー

エディットコントロールのイベントハンドラ

開発環境 ・Windows XP (32bit) ・Visual C++ 2005 以下内容でCEditの派生クラスを作成したところ、 その派生クラスを使用するダイアログで EN_CHANGEイベントがキャッチ出来ませんでした。 どうすればキャッチ出来るようになるでしょうか? アドバイス頂けると大変ありがたいです。 ※エディットコントロールに文字を入力すると  以下(1)の処理には来るのですが、  以下(2)の処理には来ませんでした。 //------------------------------------------------ // EditEx.h //------------------------------------------------ // CEditの派生クラス class CEditEx : public CEdit { public:     CEditEx(void);     virtual ~CEditEx(void); //------------------------------------------------ // EditEx.cpp //------------------------------------------------ // CEditExクラス内でEN_CHANGEイベントを処理 BEGIN_MESSAGE_MAP(CEditEx, CEdit)     ON_CONTROL_REFLECT(EN_CHANGE, &CEditEx::OnEnChange) END_MESSAGE_MAP() // EN_CHANGEイベントハンドラ void CEditEx::OnEnChange(void) {     // (1) } //------------------------------------------------ // DialogEx.h //------------------------------------------------ // CEditExクラスをメンバに持つダイアログ class CDialogEx : public CDialog { private:     CEditEx m_Edit1; //------------------------------------------------ // DialogEx.cpp //------------------------------------------------ // CDialogExクラス内でもEN_CHANGEイベントを処理したい BEGIN_MESSAGE_MAP(CDialogEx, CDialog)     ON_EN_CHANGE(IDC_EDIT1, &CDialogEx::OnEnChangeEdit1) END_MESSAGE_MAP() // EN_CHANGEイベントハンドラ void CDialogEx::OnEnChangeEdit1(void) {     // (2) }

質問者が選んだベストアンサー

  • ベストアンサー
  • kabe64
  • ベストアンサー率72% (13/18)
回答No.1

ON_CONTROL_REFLECT を ON_CONTROL_REFLECT_EX に書き換えて、 void CEditEx::OnEnChange(void) を BOOL CEditEx::OnEnChange(void) に書き換えます。 OnEnChangeの戻り値にFALSEを返せば、親(CDialogEx)のハンドラが呼び出されますよ。

pierrot55
質問者

お礼

おおっ、ダイアログ側でもイベントハンドラが呼ばれるようになりました! 素早い回答、大変助かりました。 ありがとうございます!!

関連するQ&A

  • イベントハンドラが取得できない VC++ MFC

    おはようございます(><) VC++.NETで開発を行っています。 MFCを使って開発をしています。 CDialogを継承したCmyDialogでOnLButtonDownのイベントがとれません。 OnLButtonDownのイベントを使いたかったのですが 自動でイベントを設定するプロパティのメニュー(雷のマークみたいなもの)にイベントがなかったので 自分でCmyDialog::と書いたらリストの中に OnLButtonDown( UINT nFlags,CPoint point)がでたので 定義に追加、イベントの記述を追加しました。 雷マークで作ったイベントのコードには // TODO : ここにコントロール通知ハンドラ コードを追加します。 と自動で記述され、ブレイクポイントを設定するとそこで止まるのですが 私が記述したLButtonDownのイベントでは実行してもブレイクポイントで止まりません。 他のイベントと比べて違うのは BEGIN_MESSAGE_MAP(CmyDialog, CDialog)の中に ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1) のように イベントハンドラ名、リソース名?、イベント名 と自動で記述があります。 ここを追加すればいいのかなと思いましたが 左クリックに対応するイベントハンドラ名が分かりません。 問題解決に有効な情報をお持ちの方 お力をお貸しください。 よろしくお願いします(><)

  • メッセージマップ(ON_CONTROL_RANGE)エラーについて

    c:\Documents and Settings\******\ デスクトップ\test\Project2View.cpp(22): error C2440: 'static_cast' : 'void (__thiscall CProject2View::* )(void)' から 'void (__thiscall CCmdTarget::* )(UINT)' に変換できません。 BEGIN_MESSAGE_MAP(CProject2View, CFormView)  ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)  ON_CONTROL_RANGE         (EN_CHANGE,1000,1099,OnChangeEditAll)  ON_EN_CHANGE(1000,OnChangeEditAll) END_MESSAGE_MAP() ON_CONTROL_RANGEを使用すると出ます。 どうすればいいでしょうか? *stdafx.hの#define...は、削除しました。 Visual Studio.NET 2003 です。 よろしくお願いします。

  • イベントハンドラ関数について

    現在VC++/CLR 2005 でプログラミングをしています。 基本的な事柄かもしれませんが、質問させてください  以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 その場合は private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) String^ str = textBox1->Text } //ボタン2のイベントハンドラ関数 private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { String^ str = textBox1->Text } のようにボタン2のイベントハンドラ関数をボタン1と同じように書けばいいのですが イベントハンドラ関数の処理が膨大になった場合を考えて省略する 書き方は無いのでしょうか?(以下の場合ですとエラーが起こってしまいます。) private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { button1_Click(); } 宜しくお願いします

  • 【VC++6.0】イベントハンドラ関数を流用したいのですが、、、

    VC++超初心者です。 既出の質問(http://okwave.jp/qa2658942.html)と同様ですが、VC2005(CLR)でなく、VC++6.0の時 どのようにコーディングすればよいか教えていただけませんでしょうか。 よろしくお願いします。 ********************************** 以下の2つのボタンのイベントハンドラ関数があった場合 //ボタン1のイベントハンドラ関数 void CAAAADlg::OnOK() { 処理内容 } //ボタン2のイベントハンドラ関数 void CBBBBDlg::OnOK() { } ボタン2をクリックしたときの動作とボタン1の動作を同じにしたいと思っています。 **********************************

  • visualC++での文法

    VisualC++を勉強しているのですがどうしても分からないので教えてください。例えばダイアログベースでのMFCプロジェクト test を作り、コントロールにプッシュボタンとエディットボックスを配置し、プッシュボタンのイベントハンドラに void CtestDlg::OnBnClickedButton1() { CEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); Settext -> SetWindowText("OKWEB"); } とすれば、プッシュボタンを押したときにエディットボックスにOKWEBと表示されますよね。 この場合のCEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); の(CEdit*)は何なのでしょうか?最初のCEdit* はSettextがCEdit*クラスを示すポインタになるのは理解できるのですが、(CEdit*)はオブジェクトでそれがGetDlgItemを使っているのでしょうか。それならば、(CEdit*).GetDlgItem(IDC_EDIT1) じゃないのでしょうか?それとも(CEdit*)はキャストか何かなのでしょうか? C++の勉強が足りないのは分かってるのですが、VisualC++の勉強と同時進行なのでどうも混乱しています。詳しい方どうかお願いします。

  • インライン処理

    VS2008 MFC を使用して、CListCtrlの派生クラスを全てインラインで書きたいと思い、 ・追加->クラス->C++クラス->基本クラス"CListCtrl" + インラインオプションにチェック で作成したのですが、メッセージ処理を追加するとcppファイルが出来てしまいます。 利便性からヘッダファイル単体で使用したいのですが、cppの内容をヘッダに全て書き写し、cppファイルを削除することは出来ないのでしょうか? Ex. <クラス生成直後=ヘッダファイルのみ> #pragma once #include "afxcmn.h" class CTest01 : public CListCtrl { public: CTest01(void) { } virtual ~CTest01(void) { } }; <メッセージ追加後=ヘッダ> #pragma once #include "afxcmn.h" class CTest01 : public CListCtrl { public: CTest01(void) { } virtual ~CTest01(void) { } DECLARE_MESSAGE_MAP() afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult); }; <メッセージ追加後=cpp> #include "StdAfx.h" #include "Test01.h" BEGIN_MESSAGE_MAP(CTest01, CListCtrl) ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CTest01::OnLvnColumnclick) END_MESSAGE_MAP() void CTest01::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: ここにコントロール通知ハンドラ コードを追加します。 *pResult = 0; } 上記の例でOnLvnColumnclickをヘッダファイルに記述することは可能でしたが、BEGIN_MESSAGE_MAPの辺りと、インクルードをヘッダに移動するとリンク時にエラーが出てしまいます。 メッセージ処理をする場合cppファイルは必須なのでしょうか? ・追加->クラス->MFCクラス->基本クラス"CListCtrl" で作成した場合、上記プラスIMPLEMENT_DYNAMICもインクルードファイル内に記述出来ずに困っています。 MFC初心者のため、いまいちBEGIN_MESSAGE_MAPやIMPLEMENT_DYNAMICの意味がわからず行き詰まっています。 なにかヒント等有りましたら、教えていただけないでしょうか? よろしくお願いいたします。

  • イベントハンドラを削除したら、再度生成されない

    エンバカデロ Code Gear C++ Builder 2009という開発ソフトを使用しています。 TCheckBoxというチェックボタンのコンポ-ネットを追加して、フォーム画面でこのチェックボタンをクリックした場合の処理のCommaCheckBoxClickイベントハンドラが自動的にUnit1.cppというファイルに void //fastcall TTestForm::CommaCheckBoxClick(TObject *Sender) { } というので自動的に作成されるのですが、一度この文字を削除してしまい、再度チェックボタンのアイコンをダブルクリックで同じコードを生成使用としたのですが、 ”メソッド CommaCheckBoxClick の実現部が見つかりません。”というエラーメッセージボックスが表示されるようになってしまい、この文を再度自動的に生成できなくなってしまったのですが、 一度消してしまうと再度作成はできないのでしょうか?

  • CEditクラスの透過について

    CEditクラスを派生させれば できるのでしょうか? 文字を入力した部分が白い帯になり 派生クラスで CDC *pDC=GetDC(); pDC->SetBkColor(RGB(0,0,255)); pDC->SetBkMode(TRANSPARENT); ReleaseDC(pDC); などとしても TextOut関数に対してなので 違うような気がします。 別に透過でなくても 親ウインドウ画面をコピーしてCEditの派生クラスに貼り付けても(BitBlt)いいんですが、 文字の部分にどう処理させればいいのかわかりません。 CEditクラスの派生クラスの透過は出来るのでしょうか? よろしくお願いします。

  • リッチエディットのUPDATEメッセージ受け取り方

    ダイアログにリッチエディットボックスを貼り付けています。 文字が入力されるたびにUPDATEメッセージを受け取りたいのですが。 下記注釈の意味がわからず困っています。OnInitDialog()に何かを書くということは判るのですが。ヘルプでも見つけることが出来ませんでした。 どうかこの私でも判るよう教えてください。よろしくお願いいたします。m(_ _)m void CCtypeDlg::OnUpdateRichedit() { // TODO: これが RICHEDIT コントロールの場合、コントロールは、lParam マスク // 内での論理和の ENM_UPDATE フラグ付きで EM_SETEVENTMASK // メッセージをコントロールへ送るために CDialog::OnInitDialog() 関数をオーバー // ライドしない限りこの通知を送りません。 // TODO: この位置にコントロール通知ハンドラ・・・

  • eventの概念が理解できません

    こんにちは。オブジェクト志向でVB、C#を学んでいます。デリゲートを理解してeventについて学んでいますが、よく理解できません。 イベントとは、「あるアクションが発生したことを自動的に通知するための仕組み」と本にあります。 さらに、「送信側オブジェクトのイベント(と呼ばれるクラスメンバーに、受信側のイベントハンドラー(と呼ばれるメソッド)を登録します。」とあります。 下記が本に載っているコードです。 私が理解できているのは、 ・戻り値が無し、引数をとらないメソッドを参照するオブジェクト。MyEventHandlerというデリゲートを宣言 ・戻り値が無し、引数をとらないメソッドを参照するオブジェクト。SomeEvent変数を宣言 ・MyEvent型のevt変数の宣言 理解できないのは、 evt.SomeEvent += Handler;。何をやっているかわかりません。 ここをわかりやすくお教え頂けませんでしょうか? using System; //MyEventHandler型を宣言。ここは理解できます。 delegate void MyEventHandler(); class MyEvent{ //イベントの宣言。EventHandler型の変数、SomeEvent。 public event MyEventHandler SomeEvent; public void Fire(){ if(SomeEvent !=null) SomeEvent(); } } class EventDemo{ static void Handler(){ //←イベントハンドラー Console.WriteLine("Event occurred"); } static void Main(){ MyEvent evt = new MyEvent(); evt.SomeEvent += Handler; evt.Fire(); } } また、もう一点お教え下さい。フォーム上のボタンをクリックした時に、メッセージを表示するようなイベントはどのような形で動いているのでしょうか? senderはイベントの発生元のオブジェクトがそのまま入っていて、eはイベントの補足情報が入っているのは理解しました。 ボタンをクリックした時に、ボタンクラスから何らかの情報が送られてきて、それをsenderとeで受取ると思うのですが、これのどこにeventとデリゲートが関わってくるのでしょうか? 何かモヤモヤしてeventがわかりません。 宜しくお願い致します。 private void btn_Click(object sender, EventArgs e) { messagebox.show("hello"); }

専門家に質問してみよう