インメモリダイアログとは、メモリ上のダイアログテンプレートから作成されたダイアログのことです。
WTLはインメモリダイアログを作成するためにCIndirectDialogImplクラステンプレートを用意しています。
以下に示すのはCIndirectDialogImplクラステンプレートを使用してインメモリダイアログを作成する例です。
このプログラムでは、CIndirectDialogImplクラステンプレートから派生クラスCMainDlg(これがメインウィンドウとなります)を作り、
CMainDlgクラス内でWM_INITDIALOGメッセージへの応答と、
IDOK、IDCANCELというIDを持つWM_COMMANDメッセージへの応答を定義します。
なお、このプログラムは「Win32 プロジェクト」でビルドします。
// stdafx.h
#pragma once
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>
#include <atlcrack.h>
#include <atlmisc.h>
#include <atldlgs.h>
|
// MainDlg.h
#pragma once
class CMainDlg : public CIndirectDialogImpl<CMainDlg>
{
public:
// ダイアログテンプレートマップ
BEGIN_DIALOG_EX(0, 0, 186, 95, 0)
DIALOG_CAPTION(_T("Dialog"))
DIALOG_STYLE(DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS |
WS_POPUP | WS_CAPTION | WS_SYSMENU)
DIALOG_FONT_EX(8, _T("MS Shell Dlg"), 400, 0, 0x1)
END_DIALOG()
// コントロールテンプレートマップ
BEGIN_CONTROLS_MAP()
CONTROL_DEFPUSHBUTTON(_T("OK"), IDOK, 129, 7, 50, 14, 0, 0)
CONTROL_PUSHBUTTON(_T("キャンセル"), IDCANCEL, 129, 24, 50, 14, 0, 0)
END_CONTROLS_MAP()
BEGIN_MSG_MAP(CMainDlg)
MSG_WM_INITDIALOG(OnInitDialog)
COMMAND_ID_HANDLER_EX(IDOK, OnOK)
COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
END_MSG_MAP()
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
// スクリーンの中央に配置
CenterWindow();
// 大きいアイコン設定
HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
SetIcon(hIcon, TRUE);
// 小さいアイコン設定
HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
SetIcon(hIconSmall, FALSE);
return TRUE;
}
void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl){
EndDialog(nID);
}
void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl){
EndDialog(nID);
}
};
|
// SampleProject.cpp
#include "stdafx.h"
#include "resource.h"
#include "MainDlg.h"
CAppModule _Module;
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
_Module.Init(NULL, hInstance);
CMainDlg dlg;
int nRet = (int) dlg.DoModal();
_Module.Term();
return nRet;
}
|
まず、プロジェクトにアイコンリソースを追加し、[ID]を次のように設定します。
| リソース名 |
ID |
| アイコン |
IDR_MAINFRAME |

次に、stdafx.hヘッダではCIndirectDialogImplクラステンプレートを使用するためにatldlgs.hヘッダをインクルードします。
次に、CAppModuleクラスのインスタンスをグローバルに宣言し、
_tWinMain()の最初と最後で初期化と後始末をしています。
インメモリダイアログを作成するには、DoModal()かCreate()を呼び出します。
DoModal()を呼び出すとモーダルダイアログを作成でき、
Create()を呼び出すとモードレスダイアログを作成できます。
今回の例ではモーダルダイアログを作成します。
CMainDlgクラスはCIndirectDialogImplクラステンプレートから派生していますが、
CIndirectDialogImplの第1テンプレート引数にもCMainDlgという名前を渡します(第2、第3テンプレート引数は省略可能です。ここでは省略しています。)。
CMainDlgクラス内では、ます、
ダイアログの属性を設定するためのダイアログテンプレートマップを定義します。
ダイアログテンプレートマップでは、
ダイアログの属性を設定するために以下のエントリ用マクロを使用できます。
DIALOG_CAPTION(キャプション)
ダイアログのキャプション文字列を設定します。
DIALOG_STYLE(ウィンドウスタイル)
ダイアログのウィンドウスタイルを設定します。
DIALOG_EXSTYLE(拡張ウィンドウスタイル)
ダイアログの拡張ウィンドウスタイルを設定します。
DIALOG_FONT(フォントサイズ, フォント名)
ダイアログのフォントを設定します。
DIALOG_FONT_EX(フォントサイズ, フォント名, 太さ, 斜体, 言語セット)
ダイアログのフォントを設定します。
DIALOG_MENU(メニュー名)
ダイアログのメニューを設定します。
DIALOG_CLASS(クラス名)
ダイアログのウィンドウクラス名を設定します。
次に、ダイアログ上のコントロールを設定するためのコントロールテンプレートマップを定義します。
BEGIN_CONTROLS_MAP()〜END_CONTROLS_MAP()
ダイアログ上のコントロールを設定します。
コントロールテンプレートマップでは、
ダイアログ上のコントロールを設定するために以下のエントリ用マクロを使用できます。
CONTROL_LTEXT(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
SS_LEFTスタイルのスタティックコントロールを設定します。
CONTROL_CTEXT(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
SS_CENTERスタイルのスタティックコントロールを設定します。
CONTROL_RTEXT(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
SS_RIGHTスタイルのスタティックコントロールを設定します。
CONTROL_PUSHBUTTON(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_PUSHBUTTONスタイルのボタンコントロールを設定します。
CONTROL_DEFPUSHBUTTON(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_DEFPUSHBUTTONスタイルのボタンコントロールを設定します。
CONTROL_PUSHBOX(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_PUSHBOXスタイルのボタンコントロールを設定します。
CONTROL_STATE3(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_3STATEスタイルのチェックボックスコントロールを設定します。
CONTROL_AUTO3STATE(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_AUTO3STATEスタイルのチェックボックスコントロールを設定します。
CONTROL_CHECKBOX(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
チェックボックスコントロールを設定します。
CONTROL_AUTOCHECKBOX(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_AUTOCHECKBOXスタイルのチェックボックスコントロールを設定します。
CONTROL_RADIOBUTTON(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
ラジオボタンコントロールを設定します。
CONTROL_AUTORADIOBUTTON(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
BS_AUTORADIOBUTTONスタイルのラジオボタンコントロールを設定します。
CONTROL_COMBOBOX(ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
コンボボックスコントロールを設定します。
CONTROL_EDITTEXT(ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
エディットボックスコントロールを設定します。
CONTROL_GROUPBOX(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
グループボックスコントロールを設定します。
CONTROL_LISTBOX(ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
リストボックスコントロールを設定します。
CONTROL_SCROLLBAR(ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
スクロールバーコントロールを設定します。
CONTROL_ICON(キャプション, ID, X座標, Y座標, 幅, 高さ, ウィンドウスタイル, 拡張ウィンドウスタイル)
SS_ICONスタイルのスタティックコントロールを設定します。
CONTROL_CONTROL(キャプション, ID, クラス名, ウィンドウスタイル, X座標, Y座標, 幅, 高さ, 拡張ウィンドウスタイル)
コントロールを設定します。
今回の例では、リソースIDがIDOKとIDCANCELのボタンをダイアログに設定します。
これらのボタンのWM_COMMANDメッセージハンドラでは、EndDialog()を呼び出してダイアログを閉じます。
|