ホーム ATL/WTL
スケルトン
ドキュメント種別 ATL/WTL に関する文書
最終更新日 2004/01/10
PR
 これまで ATL/WTL AppWizard を使用せずに Win32 Application プロジェクトとして プログラムを作成してきましたが、ここで ATL/WTL AppWizard を使用してみます。

次に示すのは ATL/WTL AppWizard で作成したモーダルダイアログのスケルトン(雛形)です。 作成するには、ATL/WTL AppWizard を実行して [Dialog Based] を選択し、[終了] ボタンを押します。 なお、改行やコメント、使用しないパラメータの省略など、元のソースから変更している部分があります。

// stdafx.h内
#include <atlbase.h>
#include <atlapp.h>

extern CAppModule _Module;

#include <atlwin.h>
			

// stdafx.cpp内
#include "stdafx.h"

#if (_ATL_VER < 0x0700)
#include <atlimpl.cpp>
#endif //(_ATL_VER < 0x0700)
			

// maindlg.h内
class CMainDlg : public CDialogImpl<CMainDlg>
{
public:
    enum { IDD = IDD_MAINDLG };

    // メッセージマップ
    BEGIN_MSG_MAP(CMainDlg)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
        COMMAND_ID_HANDLER(IDOK, OnOK)
        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
    END_MSG_MAP()

    LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
    {
        // スクリーンの中央に配置
        CenterWindow();

        // アイコン設定
        HICON hIcon = (HICON)::LoadImage(
            _Module.GetResourceInstance(),
            MAKEINTRESOURCE(IDR_MAINFRAME), 
            IMAGE_ICON,
            ::GetSystemMetrics(SM_CXICON),
            ::GetSystemMetrics(SM_CYICON),
            LR_DEFAULTCOLOR);
        SetIcon(hIcon, TRUE);
        HICON hIconSmall = (HICON)::LoadImage(
            _Module.GetResourceInstance(),
            MAKEINTRESOURCE(IDR_MAINFRAME), 
            IMAGE_ICON,
            ::GetSystemMetrics(SM_CXSMICON),
            ::GetSystemMetrics(SM_CYSMICON),
            LR_DEFAULTCOLOR);
        SetIcon(hIconSmall, FALSE);

        return TRUE;
    }

    LRESULT OnAppAbout(WORD, WORD, HWND, BOOL&)
    {
        // バージョン情報ダイアログ表示
        CSimpleDialog<IDD_ABOUTBOX, FALSE> dlg;
        dlg.DoModal();
        return 0;
    }

    LRESULT OnOK(WORD, WORD wID, HWND, BOOL&)
    {
        EndDialog(wID);
        return 0;
    }

    LRESULT OnCancel(WORD, WORD wID, HWND, BOOL&)
    {
        EndDialog(wID);
        return 0;
    }
};
			

// ModalDialog.cpp内
#include "stdafx.h"

#include <atlframe.h>
#include <atlctrls.h>
#include <atldlgs.h>
#include <atlctrlw.h>

#include "resource.h"

#include "maindlg.h"

CAppModule _Module;

int WINAPI _tWinMain(
    HINSTANCE hInstance,
    HINSTANCE /*hPrevInstance*/,
    LPTSTR lpstrCmdLine,
    int nCmdShow)
{
    HRESULT hRes = ::CoInitialize(NULL);
// NT4.0以降で実行する場合は、代わりに次の呼び出しを使用することでフリースレッド化
// させることができる。これは任意のRPCスレッドが呼び出されることを意味する。
//  HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    ATLASSERT(SUCCEEDED(hRes));

    // これはMicrosoft Layer for Unicode (MSLU) が使用された時の
    // ATLウインドウ thunking 問題を解決する
    ::DefWindowProc(NULL, 0, 0, 0L);

    // 他のコントロールをサポートするためのフラグを追加
    AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES);

    hRes = _Module.Init(NULL, hInstance);
    ATLASSERT(SUCCEEDED(hRes));

    int nRet = 0;
    // BLOCK: アプリケーション実行
    {
        CMainDlg dlgMain;
        nRet = dlgMain.DoModal();
    }

    _Module.Term();
    ::CoUninitialize();

    return nRet;
}
			

 このソースで目新しい部分と言えば、stdafx.cppファイル内と、_tWinMain()内でしょう。

 stdafx.cppファイルでは、ATL7.0より古いバージョンを使っている場合に、 atlimpl.cppというファイルをインクルードするようにしています。 atlimpl.cppでは、_ATL_MIN_CRTが定義されている場合に、 独自のWinMainCRTStartup()などを呼び出すようにしています。 これにより、ATLは可能な限りCランタイムライブラリ(CRT)を使用しなくなり、 プログラムのファイルサイズが小さくなります。

なお、ATL/WTL AppWizard で作成したプロジェクトのリリースビルドでは、 デフォルトで_ATL_MIN_CRTが定義されています。

_tWinMain()では、COM初期化関数やMSLUのためのコードが追加されています。

 ところで、ATL/WTL AppWizard で作成したプロジェクトのリソースはデフォルトで英語版です。 これを日本語にするためには、リソースファイル(拡張子.rc)をテキストモードで開き、 以下の部分:

/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
			

を次のように書き換えます。

/////////////////////////////////////////////////////////////////////////////
// 日本語 resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
#ifdef _WIN32
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)
#endif //_WIN32