CMyWindow.h
#ifndef __CMYWINDOW_H__
#define __CMYWINDOW_H__
template <class T, COLORREF t_crBrushColor>
class CPaintBkgnd : public CMessageMap
{
public:
CPaintBkgnd() {m_hbrBkgnd = CreateSolidBrush(t_crBrushColor);}
~CPaintBkgnd() {DeleteObject(m_hbrBkgnd);}
BEGIN_MSG_MAP(CPaintBkgnd)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
END_MSG_MAP()
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
T* pt = static_cast<T*>(this);
HDC dc = (HDC)wParam;
RECT rcClient;
pt->GetClientRect(&rcClient);
FillRect(dc, &rcClient, m_hbrBkgnd);
return 1;
}
protected:
HBRUSH m_hbrBkgnd;
};
class CMyWindow : public CWindowImpl<CMyWindow, CWindow, CFrameWinTraits>
, public CPaintBkgnd<CMyWindow, RGB(255, 0, 0)>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"));
typedef CPaintBkgnd<CMyWindow, RGB(255, 0, 0)> CPaintBkgndBase;
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
CHAIN_MSG_MAP(CPaintBkgndBase);
END_MSG_MAP()
LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandler)
{
DestroyWindow();
return 0;
}
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandler)
{
PostQuitMessage(0);
return 0;
}
};
#endif
Main.cpp
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <atlbase.h>
#include <atlwin.h>
#include "CMyWindow.h"
int WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPrev,
LPSTR lpCmdLine,
int nShowCmd)
{
CMyWindow wndMain;
if (NULL == wndMain.Create(NULL, CWindow::rcDefault, _T("My Window"))) {
return 0;
}
wndMain.ShowWindow(nShowCmd);
wndMain.UpdateWindow();
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}