1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#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(); } |