Click here to visit our sponsor

ATL を使ってウインドウの作成


SDK で ATL のウインドウクラスを使う

MFC はどうもなじめないという SDK 派の人に
オススメなのが ATL のウインドウクラス。
その使用方法を取り上げます。


目次


ウイザードでプロジェクトの作成

SDK のプロジェクト (Win32 Application) を作ってください。
種類は [単純な Win32 アプリケーション] にしておきます。

まず、ATL のインクルードの指定から。
StdAfx.h に置くのが適当でしょう。

#include<atlbase.h>
extern CComModule _Module;
#include<atlwin.h>

宣言はこの順番で行います。
_Module というのは、MFC でいうところの CWinApp にあたります。


ウインドウクラスの作成

次にウインドウクラスを作ってみます。

class CWin : public CWindowImpl<CWin>
{
public:
    CWin() {}
    virtual ~CWin() {}

    DECLARE_WND_CLASS(NULL)

BEGIN_MSG_MAP(CWin)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_CLOSE, OnClose)
END_MSG_MAP()

    LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        bHandled = false;
        return 0;
    }
    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        ::PostQuitMessage(0);
        return 0;
    }
};

BEGIN_MSG_MAP()END_MSG_MAP()マクロがウインドウプロシャージャです。
そこに必要なメッセージハンドラを書いてやります。

ハンドラで、デフォルトプロシャージャに渡したい時は、bHandledfalse にします。

DECLARE_WND_CLASS マクロでクラス名を指定します。
マクロ無し 又は NULL だと勝手に作ってくれます。


WinMain で作成して完了

あとは、WinMain() で使います。

CComModule  _Module;

int APIENTRY    WinMain(
    HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    _Module.Init(0, hInstance);

    CWin    wndMain;
    HMENU   hMenu = NULL;
    RECT    rect = { CW_USEDEFAULT, CW_USEDEFAULT, 340, 300 };

    wndMain.Create(
        NULL, rect, _T("Caption"),
        WS_OVERLAPPEDWINDOW, WS_EX_CLIENTEDGE, (UNIT)hMenu);

    wndMain.ShowWindow(nCmdShow);
    wndMain.UpdateWindow();

    MSG     msg;

    while (::GetMessage(&msg, NULL, 0, 0)) {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }
    _Module.Term();
    return 0;
}

まず、CComModule _Module を実装、
そして最初と最後に _ModuleInit()Term() を入ます。

あとはウインドウクラスを入れて、Create()
メッセージループは見慣れた奴を入れれば出来上がり。


おまけ - ダイアログのウインドウクラスの場合

ダイアログの場合です。

class CDialog : public CDialogImpl<CDialog>
{
public:
    enum { IDD = IDD_DIALOG1 };

BEGIN_MSG_MAP(CDialog)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    COMMAND_ID_HANDLER(IDOK, OnOK)
END_MSG_MAP()

    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        return 1;
    }
    LRESULT OnOK(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        EndDialog(IDOK);
        return 0;
    }
};

enum { ... } がリソースを指定するところ。
WM_COMMAND のハンドラは COMMAND_ID_HANDLER() マクロで作成します。

モーダルで使うなら

CDialog wndDialog;
wndDialog.DoModal();

サブクラス化

まだできていません。


おわりに

このページの満足度は・・・


素晴らしい!
まあまあ、良いかも
自己満足感がよくわかるページですね
まったくもって説明不足


Visual C++ページトップ

HOME

兄弟ページ 姉妹ページ
Click here to visit our sponsor