• 締切済み

メッセージハンドラ

超素人です。 研究でこれからMFCを使います。そこで、全くわからないのでテンプレートを用いようとしたのですが、メッセージハンドラと記述されている部分が何かわかりません。 ダイアログはわかったのですが、メッセージハンドラってなんですか? また、VC++6.0でテンプレを用いると、Dlg.cppの中のDDX_ControlやON_BN_CLICKEDの分がコメントでもないのに、灰色で記述されています。これはなぜでしょうか? ウェブでよんでもわからなかったので、投稿しました。よろしくお願いします。

みんなの回答

  • nim05
  • ベストアンサー率61% (111/181)
回答No.2

メッセージハンドラは何か?ですが、その前に、「イベント駆動」型プログラミングというのは分かりますか? http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E9%A7%86%E5%8B%95%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0 簡単に言うと、マウスやキーボードから入力された、とか、ウィンドウが画面に表示された、など、アプリケーションにとって、何かしなければいけない変化が発生した時に、「イベント」が起こります。 このイベントが起こったぞ!という「メッセージ」がOSから伝えられたら、アプリケーションがそれに応じた個々処理する関数を「メッセージハンドラ」といいます。 テンプレートのメッセージハンドラは、必ず、何らかのイベントに対応しているので、何が起こったときに呼ばれるのかを調べていくと、何となくつかめるんじゃないでしょうか。 で、灰色になっているのは、redfox63 さんがおっしゃるとおりですが、簡単に言うと、VCが自動的に挿入してくれた部分なので、気を利かせて灰色で表示してあげているだけです。コメントアウトされているわけではありません。

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

DDX_ControlやON_BN_CLICKEDなどは VC6のクラスウィザードが管理している部分です 灰色になっているのは その前後にMFCの管理用マクロがあるためです //{{AFX_MSG_MAP(Cxx,Cxxxx) ここにON_BN_CLICKEDなどがある //}}AFX_MSG_MAP のように AFX_MSG_MAPなどがMFC固有のマクロです メッセージマップは ハンドラとWindowsメッセージを結びつけるものです DDX_Controlは AFX_DATA_MAPによりコントロールとメンバー変数を結びつけるものです

関連するQ&A

  • VC++.NET DLLからのダイアログの表示

    こんばんは。 VC++.NETでDLLを作成しました。 内容はダイアログを表示させるだけの単純なもので DLLの種類はMFC拡張DLLで作成しました。 (CDIALOGを継承したクラスTESTDIALOGのコンストラクタ、デストラクタがあるだけのもの) これをテスト用の単純なMFCアプリケーションで呼び出したところ ダイアログを表示させることができましたが 別の複雑なアプリケーション(DLLからDLLを呼ぶなどしている)で 呼び出したところダイアログが表示されません。 コンパイルエラーなどもでないし 何がいけないのか分かりません。 呼び出し側ではメニューにイベントハンドラを作ってそこで TESTDIALOG dlg; dlg.DoModal(); としているだけなのですが・・・ (デバッガで追ったところMFCのdlgcore.cppのCDialog::DoModalの m_lpDialogTemplateNameが不適切なptrとなる辺りに原因はありそうなのですが何故そうなるのかわかりません。) どなたかダイアログが表示されない原因がお分かりになる方 よろしくお願いします。

  • メッセージボックスが表示されないのですが?

    WIN98 VC++6.0 MFCにて mmmというプロジェクト名でウィザードに従いダイアログベースのPGを作りました。 下記のようにコードの2箇所にAfxMessageBox("3",MB_OK);を追加しましたが、どちらもメッセージボックスが表示されません。 どうしてなのでしょうか? お分かりも方是非教えてください。 ************************** BOOL CMmmApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CMmmDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); AfxMessageBox("3",MB_OK);//■追加 if (nResponse == IDOK) { AfxMessageBox("3",MB_OK);//■追加 } else if (nResponse == IDCANCEL) { } // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、 // アプリケーションを終了するために FALSE を返してください。 return FALSE; }

  • ダイアログ間のメッセージの送信について

    いつもお世話になっております。 現在、Visual Studio 2005にてMFCのダイアログベースのアプリケーションを作成しており、メッセージの送信の件で詰まった箇所があり質問させて頂きました。 現在のアプリケーションの全体像なのですが、 ダイアログベースなので、アプリケーション立ち上げ時に1つメインダイアログが表示されます。 そのメインダイアログ内にボタンを設置したとして、それぞれのボタン1,ボタン2からダイアログ1,ダイアログ2をDoModal()で表示させます。 それぞれのダイアログ1,2にはボタンが1つずつ設置されているとします。 質問させて頂きたいことは メインダイアログへダイアログ1,2からメッセージ送信をする場合には ::SendMessage(GetParent()->GetSafeHwnd(),MYMSG,0); でメッセージ送信をすることは出来ました。 しかしメインダイアログから呼び出されるダイアログ1,2間でメッセージを送信する場合に,例えばダイアログ1からダイアログ2へメッセージを送信させたいときに void C****1Dlg::OnBnClicked(){ C****2Dlg m_dlg2; ::SendMessage(m_dlg2.GetSafeHwnd(),MYMSG,0); とダイアログ1のボタンクリック時の関数内にコードを入力してもダイアログ2へメッセージは送信されず(ダイアログ2内のメッセージ受信関数OnMyMsg()が呼ばれず)、そのままスルーされるようなのです。 上述のコードで何か間違えている箇所があるでしょうか? メッセージを扱うのは初めてで、とにかく相手先のウィンドウのハンドルを取得できればいいのかなと思ってコードを書いてみたのですが。。 ご存知の方がいらっしゃいましたら、ご意見宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。

  • ダイアログをアクティブにするには?

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて ダイアログを非表示から dlg->ShowWindow(SW_SHOW);にて 表示にしましたが、アクティブ状態になっていません。 アクティブにするにはどうすれば良いですか?

  • ダイアログベースのウィンドウメッセージについて

    Win2kのVC++6.0 MFC ダイアログベースでのウィンドウメッセージ処理で困っています。 OnCharがダイアログでは認識できません。ウィンドウでは認識できます。 何か特別な処理が必要なのでしょうか?

  • イベントハンドラが取得できない 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) のように イベントハンドラ名、リソース名?、イベント名 と自動で記述があります。 ここを追加すればいいのかなと思いましたが 左クリックに対応するイベントハンドラ名が分かりません。 問題解決に有効な情報をお持ちの方 お力をお貸しください。 よろしくお願いします(><)

  • MFCに関する質問です。

    [VisualStudio2010]でMFCを勉強しているVC++初心者です。 (VBは、不足なく記述できるレベルです。) 現在、勉強でダイヤログアプリケーションを作成しており、配置しているボタンコントロールの色を変更しようとしていたのですが、やり方がよくわかりません。 どなたかご教示をお願いいたします。 ※簡単だと思っていたのですが・・・てこずってしまい、困っています。 尚、現時点では・・・ ボタンにはコントロール変数として m_Btn1 としております。 Dlg.cpp の  「// TODO: 初期化をここに追加します。」以降に m_Btn1.??? = 色 と記述しようと思っているのですが・・・???がわかりません。 検索してみましたが・・・やはりわかりません。(記述方法がばらばらで・・・) どなたが、ご教示頂きますようお願い致します。

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

    開発環境 ・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) }

  • SendMessage();の使い方

    よろしくお願いします。 <環境> WIN98 VC++6.0 MFC SDIにてウィンドウをクリックすると、モードレスダイアログ1とモーダルダイア ログ2が開くようにしました。 void CMy222View::OnLButtonDown(UINT nFlags, CPoint point) { CDlg1 *dlg; dlg = new CDlg1; dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); CDlg2 dlg2; dlg2.DoModal(); CView::OnLButtonDown(nFlags, point); } ダイアログ2のボタン押し下げにてダイアログ1のボタン1を押し下げたいのですが 、どのようにすれば実現できるのでしょうか? void CDlg2::OnButton2() { SendMessage(); //■ここの書き方が分かりません CDialog::OnOK(); } 宜しくお願いいたします。

  • VC++でダイアログ表示について

    VC++初心者です。 MFCアプリケーションでダイアログベースのアプリケーションを作ったのですが、ボタンクリック時にもう一つダイアログを表示しようと思っています。 以下のコードだと、うまく表示されずに画面がフリーズしてしまいます。どこを直したらいいのでしょうか。ご教授願います。 環境は、xp、Visual Studio.net 2003です。 void CMFCtestDlg::OnBnClickedButton1() {   //   CmyDialog myDL;   myDL.DoModal(); } MFCtestDlg.cpp内、#include "myDialog.h" は記述してあります。 VBの経験はあるのですが、VC++はまったくわかりません。 よろしくお願いします。

専門家に質問してみよう