说明:代码均来自WTL_for_MFC_programmers
#include // atlbase 包含通用定义 CComModule _Module; // 全局对象_Module 必须被定义,而且名字不能变. // 此对象类必须是CComModule或派生自CComModule类 #include // atlwin包括了一些基类窗体和消息处理宏的定义 #include #include "resource.h" class CAboutDlg : public CDialogImpl // 对话框窗体派生自CDialogImpl { public: enum {IDD = IDD_ABOUT}; BEGIN_MSG_MAP(CAboutDlg) MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog) // 使用MESSAGE_HANDLER宏处理消息 COMMAND_ID_HANDLER(IDOK,OnOKCancel) // 使用COMMAND_ID_HANDLER 处理命令 COMMAND_ID_HANDLER(IDCANCEL,OnOKCancel) END_MSG_MAP() // 注意有括号 protected: // nMsg : 要处理的消息 // bHandled : 如果设置为false,将会自动调用基类的默认消息处理函数WindowProc LRESULT OnInitDialog(UINT nMsg,WPARAM ,LPARAM ,BOOL &bHandled) { CenterWindow(); bHandled = TRUE; return 1; // 返回1代表不调用基类的消息处理函数 } // 命令消息处理函数的参数已经被展开了 LRESULT OnOKCancel(WORD wNotify,WORD wID,HWND hWnd,BOOL &bHandled) { EndDialog(0); return 0; } }; template class CPaintbkWnd : public CMessageMap // 从CMessageMap派生.不是必须的 /**CMessageMap 的定义是: class ATL_NO_VTABLE CMessageMap { public: virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID) = 0; } */ { public: CPaintbkWnd() { m_hBruBk = ::CreateSolidBrush(ColorBK); } ~CPaintbkWnd() { DeleteBrush(m_hBruBk); } BEGIN_MSG_MAP(CPaintbkWnd) MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBkgnd) END_MSG_MAP() protected: HBRUSH m_hBruBk; LRESULT OnEraseBkgnd(UINT nMsg,WPARAM wParam, LPARAM , BOOL &) { T *pT = static_cast(this); HDC hDC = (HDC)wParam; HBRUSH hBru = SelectBrush(hDC,m_hBruBk); RECT rc; pT->GetClientRect(&rc); FillRect(hDC,&rc,m_hBruBk); SelectBrush(hDC,hBru); return 1; } }; // 这只是定义一个窗口的风格, // CWinTraits的定义如下: /* template class CWinTraits { public: static DWORD GetWndStyle(DWORD dwStyle) { return dwStyle == 0 ? t_dwStyle : dwStyle; } static DWORD GetWndExStyle(DWORD dwExStyle) { return dwExStyle == 0 ? t_dwExStyle : dwExStyle; } }; */ typedef CWinTraits MyWndTraits; // CWindowImpl 的三个模板参数分别是: // 本类名,基类名,窗口风格 class CMyWindow : public CWindowImpl, public CPaintbkWnd { typedef CPaintbkWnd CPaintBase; public: DECLARE_WND_CLASS(_T("FirstATLClass")) BEGIN_MSG_MAP(CMyWindow) MESSAGE_HANDLER(WM_CREATE, OnCreate) MESSAGE_HANDLER(WM_CLOSE, OnClose) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) COMMAND_ID_HANDLER(ID_ABOUT,OnAbout) CHAIN_MSG_MAP(CPaintBase)// 高级消息映射表, // 这样除了上面已经被处理的消息外,其余的所有的消息都会传入到这个类中 // 可以添加多个这样的消息表 END_MSG_MAP() protected: LRESULT OnCreate(UINT nMsg,WPARAM ,LPARAM lParam,BOOL &bHandled) { HMENU hMenu = LoadMenu(_Module.GetResourceInstance(),MAKEINTRESOURCE(IDR_MENU)); SetMenu(hMenu); return 0; } LRESULT OnClose(UINT nMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled) { DestroyWindow(); return 0; } LRESULT OnDestroy(UINT nMsg,WPARAM wParam,LPARAM lParam,BOOL &bHandled) { PostQuitMessage(0); return 0; } LRESULT OnAbout(WORD wNotify,WORD wID,HWND ,BOOL &bHandled) { CAboutDlg dlg; dlg.DoModal(); return 0; } }; extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) { // CoInitialize(NULL); // 使用_Module的init初始化就不必使用CoInitialize初始化COM了 _Module.Init(NULL,hInstance,NULL); CMyWindow wnd; if (!wnd.Create(NULL,CWindow::rcDefault)) // 创建窗口,rcDefault是一个静态成员 return 1; wnd.ShowWindow(SW_SHOW); wnd.UpdateWindow(); MSG msg; // ATL没有自己的消息泵,因此自己提取消息 while (GetMessage(&msg,wnd,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } // CoUninitialize(); _Module.Term(); // uninitiate return msg.wParam; }