ホーム ATL/WTL
インメモリダイアログ
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2007/03/10
PR
 インメモリダイアログとは、メモリ上のダイアログテンプレートから作成されたダイアログのことです。 WTLはインメモリダイアログを作成するためにCIndirectDialogImplクラステンプレートを用意しています。

 以下に示すのはCIndirectDialogImplクラステンプレートを使用してインメモリダイアログを作成する例です。 このプログラムでは、CIndirectDialogImplクラステンプレートから派生クラスCMainDlg(これがメインウィンドウとなります)を作り、 CMainDlgクラス内でWM_INITDIALOGメッセージへの応答と、 IDOKIDCANCELという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クラス内では、ます、 ダイアログの属性を設定するためのダイアログテンプレートマップを定義します。

  • BEGIN_DIALOG(X座標, Y座標, 幅, 高さ)END_DIALOG()
    ダイアログを表示する位置とサイズを設定します。

  • BEGIN_DIALOG_EX(X座標, Y座標, 幅, 高さ, ヘルプID)END_DIALOG()
    ダイアログを表示する位置とサイズ、ヘルプIDを設定します。

ダイアログテンプレートマップでは、 ダイアログの属性を設定するために以下のエントリ用マクロを使用できます。

  • 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がIDOKIDCANCELのボタンをダイアログに設定します。 これらのボタンのWM_COMMANDメッセージハンドラでは、EndDialog()を呼び出してダイアログを閉じます。