ホーム

OFF-SOFT.net

OFF-SOFT.net

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

MFCからWTLへ(2) ウィザードの罠(ダイアログ編)

公開日| 2009年05月05日 | コメントはまだありません。
MFCのハンドラに近づける
メッセージのチェックをMFCに近づける
MFCに近づけるために、WTLで定義されている"COMMAND_HANDLER_EX"を使います。
(atlclack.hにほとんどのメッセージマップマクロ定義があります。)
これを使って、以下のように変更を行います。

[MainDlg.hの変更]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
	BEGIN_MSG_MAP(CMainDlg)
		MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
			:
		COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
		// 以下の1行を変更!!
		//COMMAND_ID_HANDLER(IDC_BUTTON1, OnThankYou)
		COMMAND_HANDLER_EX(IDC_BUTTON1, BN_CLICKED,OnThankYou)
	END_MSG_MAP()
	:
	:
	LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
		// 以下の1行を変更!!
//	LRESULT OnThankYou(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
	void OnThankYou(UINT uNotifyCode, int nID, CWindow wndCtl);

[MainDlg.cppの変更]
1
2
3
4
5
6
//LRESULT CMainDlg::OnThankYou(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
void CMainDlg::OnThankYou(UINT uNotifyCode, int nID, CWindow wndCtl)
{
	MessageBox("ThankYou");
//	return 0;
}

ウィザードの罠(2)
このままコンパイルすると以下のエラーが出ます。
error C3867: 'CMainDlg::OnThankYou': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&CMainDlg::OnThankYou' を使用してください
error C2143: 構文エラー : ';' が 'break' の前にありません。
error C3861: 'COMMAND_HANDLER_EX': 識別子が見つかりませんでした
ウィザードで作成したものは、デフォルトで、WTLのメッセージマップマクロのヘッダと取り込んでいないのです。

stdafx.hに以下のように追加してやります。
1
2
3
4
5
	:
#include <atldlgs.h>
//	追加
#include <atlcrack.h>      // WTL enhanced msg map macros
	:

これで大丈夫かとおもいきや、コンパイルを実行すると以下のようなエラーが出力されます。
error C3861: 'SetMsgHandled': 識別子が見つかりませんでした
error C3861: 'IsMsgHandled': 識別子が見つかりませんでした

これは、WTL80からの問題か?不明ですが、マップ開始定義に、"BEGIN_MSG_MAP"でなく"BEGIN_MSG_MAP_EX"を使用しなければならなくなっています。
ドキュメントを見る限りでは、WTL7.0以降は、"BEGIN_MSG_MAP"でも"BEGIN_MSG_MAP_EX"でも良いように記述がありますが、実際には、そのドキュメントの注意に従い "BEGIN_MSG_MAP_EX"を使わないといけないようです。

ここまでやると、ビルドが完了できるはずです。

罠?というほどのことはなくて、単純に、ウィザードをそのまま鵜呑みにしていると、カスタマイズするときに、 結構、面倒ですよという意味合いでくみとっていただけると助かります。

実際に、WTLを使うためのウィザードではなく、ATLで画面を簡単に作成するためのウィザードと捕らえることが 混乱を招かないと思います。
MFCのウィザードでは、ウィザードを使った後は、MFCを使ってたいていのことができますが、 WTLのウィザードでは、ウィザードを使った後は、ATLを使ってたいていのことができる環境が整うと思うべきなのでしょうね。

結局のところ、WTLは、WindowsAPI+ATLとテンプレートの組み合わせです。
もっと、そのあたりについて詳しく知りたい方は、以下の本なども良いと思います。
はじめて間もない方は、2,3冊読まれると、ネットの記事を読んでも、おおよその理解ができるようになると思います。
本は、経験者でも、ネットだけでは判らない様々な事に気づかされることがあります。


プログラミングWindows第5版〈上〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)

プログラミングWindows第5版〈下〉Win32 APIを扱う開発者のための決定版! (Microsoft Programming Series)

C++テンプレートテクニック

プログラムを作ろう! Microsoft Visual C++ 2008 Express Edition 入門 (マイクロソフト公式解説書)

コメント

コメントをどうぞ







  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ