#include <Windows.h>
#define DECLARE_MESSAGE_MAP() static MessageMap messageMap[];
#define BEGIN_MESSAGE_MAP(class_name) MessageMap class_name::messageMap[]={
#define END_MESSAGE_MAP() {0,NULL}};
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam);
//Class CObject
class CObject{
protected:
static char szAppName[];
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
public:
void InitInstance(HINSTANCE hInstance, PSTR szCmdLine, int iCmdShow);
void Run();//Message
WPARAM ExitInstance(); //exit
//message handler
virtual void OnCreate() = 0;
virtual void OnDraw() = 0;
virtual void OnDestroy() = 0;
};
void CObject::InitInstance(HINSTANCE hInstance, PSTR szCmdLine, int iCmdShow)
{
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra= 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wndclass);
hwnd = CreateWindow(szAppName,
"Hello Program",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
}
void CObject::Run(){
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
WPARAM CObject::ExitInstance(){
return msg.wParam;
}
char CObject::szAppName[]="HelloWin";
//CObject* pCObject;
//class CView
class CView;
typedef void (CView::*CViewFunPointer)();//함수포인터
typedef struct tagMessgeMap{ //구조체
UINT iMsg;
CViewFunPointer fp; //함수포인터 주소
}MessageMap;
static CViewFunPointer fpCViewGlobal; //정적 주소
class CView:public CObject{
public:
//static MessageMap messageMap[];
DECLARE_MESSAGE_MAP()
//override all message handler
void OnCreate();
void OnDraw();
void OnDestroy();
};
BEGIN_MESSAGE_MAP(CView)
//MessageMap CView::messageMap[]={
{WM_CREATE,&CView::OnCreate},
{WM_PAINT,&CView::OnDraw},
{WM_DESTROY,&CView::OnDestroy},
//{0,NULL}
//};
END_MESSAGE_MAP()
void CView::OnCreate(){
}
void CView::OnDraw()
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,"Hello Window",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
}
void CView::OnDestroy() {
PostQuitMessage(0);
}
CView app;
LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
int i=0;
while(CView::messageMap[i].iMsg!=0){
if(iMsg==CView::messageMap[i].iMsg){
fpCViewGlobal=CView::messageMap[i].fp;
(app.*fpCViewGlobal)();
return 0;
}
++i;
}
return DefWindowProc(hwnd,iMsg,wParam,lParam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
//pCObject = &app; // CView app;
app.InitInstance(hInstance,szCmdLine,iCmdShow);
app.Run();
return app.ExitInstance();
}