MFCからWTLへ(2) ウィザードの罠(ダイアログ編)
新しいボタンを追加して、メッセージボックスを表示してみましょう
新しいボタンを追加する
ResEditを使って、ボタンを追加します。
ここでは、例として
Caption:ありがとう
ID:IDC_BUTTON1
とします。
スライダーコントロールやピクチャーコントロールなどを貼り付けて、(以下のメッセージのような)リソースのコンパイルエラーが発生する場合があります。
これは、COMMCTRLのヘッダを正しく読み込めていない場合などに発生することが多いようです。
(単純に環境設定に問題があります。)
error RC2104 : undefined keyword or key name: WC_STATIC
[ ツール ] - [ オプション ]
[ プロジェクトおよびソリューション ](画面左) - [ インクルードファイル ](画面右)

で、Microsoft Platform SDKのincludeディレクトリを先頭まで、順位を上げてあげます。
%Platform SDKインストールディレクトリ%\include
例) C:\Program Files\Microsoft Platform SDK\Include
その後、リビルドを実施してみてください。先のエラーはなくなると思います。
新しいボタンのハンドラを追加する
VC++側で、OKボタンのハンドラにならって、追加していきます。
[MainDlg.hに追加]
1
2
3
4
5
6
7
8
9
10
11
12
| BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
:
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
// 以下の1行を追加!!
COMMAND_ID_HANDLER(IDC_BUTTON1, 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*/);
|
[MainDlg.cppの最終行に追加]
1
2
3
4
5
| LRESULT CMainDlg::OnThankYou(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
MessageBox("ThankYou");
return 0;
}
|
ビルドして実行してみる
ビルドして、実行してみると簡単にメッセージボックスが表示できたと思います。
ここまでは、非常に簡単でした。MFCをお使いの方であれば、このハンドラのパラメータの多さに少々びっくりされているでしょう。
COMMAND_ID_HANDLERのマクロの定義を見ると、更に、?があります。
1
2
3
4
5
6
7
8
| #define COMMAND_ID_HANDLER(id, func) \
if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \
{ \
bHandled = TRUE; \
lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
if(bHandled) \
return TRUE; \
}
|
確かに動作的に同じになるのですが、wParamのlowしか見ていないのです。
実際にMFCでは、以下のように展開されるのですから、同じようにするには、wParamのhighを"BN_CLICKED"で確認した後、ハンドラのコールを行うべきですね。
ただ、これは、これでも良いのだとは思いますが、ここでは、正確にいきますので、次に、MFCに近づけていきたいと思います。
(WTLでもそれに相当するハンドラの定義があります。)
[dlgtestDlg.hの最後に追加]
1
2
3
4
| :
public:
afx_msg void OnThankYou();
:
|
[dlgtestDlg.cppに追加]
1
2
3
4
5
6
7
8
9
10
11
12
13
| BEGIN_MESSAGE_MAP(CdlgtestDlg, CDialog)
:
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnThankYou)
END_MESSAGE_MAP()
:
:
:
void CdlgtestDlg::OnThankYou()
{
// TODO : ここにコントロール通知ハンドラ コードを追加します。
MessageBox("ThankYou");
}
|
コメントをどうぞ