MFC で CDialog 派生クラスを作らずにモーダルダイアログを作る

概要

MFC の CDialog クラスを使い、CDialog 派生クラスを作らずにモーダルダイアログを作る方法について。

ダイアログテンプレートのリソース名が IDD_STRINGEDIT (define マクロで定義された整数値)である場合、次のようなコードになる。

int     rc; // result code
HRSRC   res;
HGLOBAL loadedResHdl;

// リソースを検索
res = FindResource( AfxGetApp()->m_hInstance,
                    static_cast<LPCTSTR>( IDD_MYDIALOG ),
                    RT_DIALOG );
if( res == NULL )
{
    return FALSE;
}

// リソースをメモリに読み出す
loadedResHdl = LoadResource( AfxGetApp()->m_hInstance, res );
if( loadedResHdl == NULL )
{
    return FALSE;
}

// ダイアログのモーダル実行を準備
rc = dlg.InitModalIndirect( loadedResHdl, NULL );
if( rc == FALSE )
{
    return FALSE;
}

// ダイアログをモーダル表示
rc = dlg.DoModal();
if( rc != IDOK )
{
    // do something
}
// do something

FindResource の第二引数には検索するリソースの名前を表す文字列を与える。 しかし Visual C++ のダイアログエディタで作ったダイアログリソースのように整数をリソースの識別子に使う場合は、その整数を文字列にキャストして与える。 つまり、sprintf や itoa などを使って数値を文字に変換したものを与えるわけではない