Category Archives: C++
CDocument CView CMainFrame 간 많이 쓰이는 호출 함수들
①CView::GetDocument() ②CDocument::UpdateAllViews() ③CView::OnUpdate() ④CDocument::GetNextView() ⑤CMainFrame::GetActiveView() ⑥CMainFrame::GetActiveDocument() 함수 ⑦CDC::GetSafeHdc() -> HDC를 얻는다. ⑧CWnd::GetSafeHwnd() -> HWND를 얻는다. ⑨::AfxGetInstanceHandle() -> HINSTANCE를 얻는다. ⑩::AfxGetMainWnd() -> MainFrame 윈도우 객체의 포인터를 얻는다. ⑪::AfxGetResourceHandle() -> 리소스 핸들(HINSTANCE)을 얻는다. ⑫::AfxMessageBox() -> 메시지박스를 실행한다.
글자 입력 및 저장(한글 지원)
SingleDoc.h SingleView.cpp SingleDoc.cpp
OnSaveDocument(LPCTSTR lpszPathName) source
DDX 대화상자
DDX dialog 샘플다운로드
MFC 에서 Sine 구현
소스 다운로드
GDI함수의 래퍼클래스 제작으로 Sine 곡선그리기
소스 다운로드
메시지만 집중한 window
stdafx.h stdafx.cpp CObject.h CObject.cpp CView.h 메시지만 집중 CView.cpp MFC가 생성한 코드에 CView.h CView.cpp 만 있다고 생각해봐라. 간결함 그 자체이다.
매크로 사용 Window
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 |
#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(); } |
멤버함수포인터 테이블 이용 Window
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 |
#include <Windows.h> 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[]; //override all message handler void OnCreate(); void OnDraw(); void OnDestroy(); }; //{{BEGIN_MESSAGE_MAP 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; pCObject->InitInstance(hInstance,szCmdLine,iCmdShow); pCObject->Run(); return pCObject->ExitInstance(); } |