ATL编程真不好理解,摸索了两三天,总算搞清楚了窗口和对话框的显示。
其消息映射原理好象与MFC差不太多,只不过模版就用得多了:
#include "stdafx.h"
#include "resource.h"
#include <atlbase.h>
CComModule _Module;
#include <atlwin.h>
//
class CModeDialog : public CDialogImpl<CModeDialog>
{
public:
enum { IDD = IDD_DLG_SECOND};
BEGIN_MSG_MAP(CModeDialog)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
MESSAGE_HANDLER(WM_CLOSE,OnClose)
END_MSG_MAP()
LRESULT OnInitDialog(UINT,WPARAM,LPARAM,BOOL&)
{
return 0;
}
LRESULT OnClose(UINT,WPARAM,LPARAM,BOOL&)
{
DestroyWindow();
return 0;
}
};
//
class CMainWindow : public CWindowImpl<CMainWindow>
{
BEGIN_MSG_MAP(CMainWindow)
MESSAGE_HANDLER(WM_CREATE,OnCreate)
MESSAGE_HANDLER(WM_PAINT,OnPaint)
MESSAGE_HANDLER(WM_LBUTTONDOWN,OnLButtonDown)
MESSAGE_HANDLER(WM_RBUTTONDOWN,OnRButtonDown)
MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
END_MSG_MAP()
LRESULT OnCreate(UINT,WPARAM,LPARAM,BOOL&)
{
return 0;
}
LRESULT OnLButtonDown(UINT,WPARAM,LPARAM,BOOL&)
{
//显示模态对话框
CSimpleDialog<IDD_DLG_FIRST> simdlg;
simdlg.DoModal();
return 0;
}
LRESULT OnRButtonDown(UINT,WPARAM,LPARAM,BOOL&)
{
//显示非模态对话框
CModeDialog *pDlg = new CModeDialog;
pDlg->Create(0);
pDlg->ShowWindow(SW_NORMAL);
return 0;
}
LRESULT OnPaint(UINT,WPARAM,LPARAM,BOOL&)
{
PAINTSTRUCT ps;
HDC hdc = GetDC();
BeginPaint(&ps);
RECT rc;
GetClientRect(&rc);
HBRUSH hbr = CreateSolidBrush(RGB(0,255,255));
HBRUSH oldHbr = (HBRUSH)SelectObject(hdc,hbr);
FillRect(hdc,&rc,hbr);
SelectObject(hdc,oldHbr);
DeleteObject(hbr);
EndPaint(&ps);
return 0;
}
LRESULT OnDestroy(UINT,WPARAM,LPARAM,BOOL&)
{
PostQuitMessage(0);
return 0;
}
};
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
_Module.Init(0,hInstance);
//创建和显示窗口
CMainWindow window;
RECT rcpos = {0,0,300,300};
window.Create(NULL,
rcpos,
"Main Window",
WS_VISIBLE|WS_OVERLAPPEDWINDOW);
MSG msg;
while(GetMessage(&msg,0,0,0))
{
//消息循环
TranslateMessage(&msg);
DispatchMessage(&msg);
}
_Module.Term();
return 0;
}