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()マクロがウインドウプロシャージャです。
そこに必要なメッセージハンドラを書いてやります。
ハンドラで、デフォルトプロシャージャに渡したい時は、bHandled を false にします。
DECLARE_WND_CLASS マクロでクラス名を指定します。
マクロ無し 又は NULL だと勝手に作ってくれます。
あとは、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 を実装、
そして最初と最後に _Module の Init() と 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();
まだできていません。