把所有都外抛出去 把这些都像装饰品一样插在上面就是设计模式-》装饰模式
template<class T, COLORREF clr>
class CPaintBackground :public CMessageMap
{
public:
CPaintBackground() {
m_br = CreateSolidBrush(clr);
}
~CPaintBackground() {
if (m_br != NULL) {//安全
DeleteObject(m_br);
m_br = NULL;
}
}
BEGIN_MSG_MAP(CPaintBackground)
MESSAGE_HANDLER(WM_ERASEBKGND,OnEraseBKgnd)
END_MSG_MAP()
LRESULT OnEraseBKgnd(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{//重绘背景
T* p = static_cast<T*>(this);
HDC dc = (HDC)wParam;//
RECT rc;//绘制窗口
p->GetClientRect(&rc);
FillRect(dc, &rc, m_br);
return TRUE;
}
protected:
HBRUSH m_br;//绘制的颜色
};
#define BACKGNDCLR RGB(255,0,0) //背景宏
class MyWindow :
public CWindowImpl<MyWindow,CWindow,CZxTraits>,//默认就是CWindow 也可以主动填
public CPaintBackground<MyWindow, BACKGNDCLR>//添加父类
{//设计模式-->>装修模式 把所有都外抛出去 把这些都像装饰品一样插在上面就是设计模式-》装饰模式
public:
DECLARE_WND_CLASS(_T("ZX Windows Class"));//窗口类定义
//重定类型
typedef CPaintBackground<MyWindow, BACKGNDCLR> CPaintBKgndBase;
//声明消息映射表
BEGIN_MSG_MAP(MyWindow)
MESSAGE_HANDLER(WM_CREATE,OnCreate)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
COMMAND_ID_HANDLER(ID_HELLO_WORLD, OnAbout)
CHAIN_MSG_MAP(CPaintBKgndBase)//放入映射表
END_MSG_MAP()
LRESULT OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HMENU hMenu = LoadMenu(gModule.GetModuleInstance(), MAKEINTRESOURCE(IDR_ABOUT));
SetMenu(hMenu);
return 0;
}
LRESULT OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{//bHandler TRUE 则不会调用 WindowProc FALSE 会调用WindowProc来继续处理
DestroyWindow();
return 0;
}
LRESULT OnDestroy(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PostQuitMessage(0);
return 0;
}
LRESULT OnAbout(WORD wNotifyCode, WORD wID, HWND hWndCtrl, BOOL& bHandled)
{
OutputDebugString(_T("OnAbout called!\r\n"));
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
};
(续ATL1)