프로그래밍/MFC
MFC 기본 구조
에어버스
2016. 5. 28. 12:37
MFC 기본 구조
Win32로 프로젝트를 만들고 MFC를 사용하므로 아래 그림처럼 MFC사용 옵션처럼 변경한다.
소스 코드는 CHelloApp, CMainFrame, 메시지맵 3가지로 구현한다.
MFC 기본코드 (아래 SDK기본코드와 비교)
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 |
#include <afxwin.h>
// windows.h 파일을 포함하고, MFC에서 제공하는 각종 클래스, 데이터 타입, 매크로 등이 여기에 선언되어 있다
// CWinApp : 응용프로그램 초기화, 메시지루프, 종료 코드를 제공
class CHelloMFC : public CWinApp
{
public:
virtual BOOL InitInstance();
};
// CFrameWnd : 윈도우의 기능 제공
class CMainFrame : public CFrameWnd
{
public:
CMainFrame();
protected:
afx_msg void OnPaint(); // MESSAGE_MAP 에 의해 윈도우 메시지와 핸들러 연결
afx_msg void OnLButtonDown(UINT nFlag, CPoint point);
DECLARE_MESSAGE_MAP()
};
CHelloMFC theApp;
// 모든 응용프로그램은 CWinApp로 부터 하나의 클래스를 파생하고 이 클래스오부터 하나의 객체를 전역변수로 생성
// 이 객체를 응용프로그램 객체라 부른다.
// MFC내에 숨겨진 WinMain()는 프로그램이 시작되면 응용프로그램 객체의 InitInstance()를 호출한다.
// 초기화 작업을 여기서 해주면된다.
BOOL CHelloMFC::InitInstance()
{
m_pMainWnd = new CMainFrame;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE; // FALSE 반환하면 프로그램은 종료됨
}
CMainFrame::CMainFrame()
{
Create(NULL, TEXT("HelloMFC Application")); // SDK의 CreateWindow()와 같음
}
// SDK 의 WndProc()에서 switch-case문에서 메시지 처리를 아래와 같이 구현, 각 메시지를 함수로 구분
void CMainFrame::OnPaint()
{
TCHAR* msg = L"Hello, MFC";
CPaintDC dc(this);
dc.TextOutW(100, 100, msg, lstrlen(msg));
}
void CMainFrame::OnLButtonDown(UINT nFlag, CPoint point)
{
MessageBox(L"마우스를 클릭했습니다.", L"마우스 메시지");
}
// 메시지 맵으로 메시지와 핸들러를 연결
BEGIN_MESSAGE_MAP (CMainFrame, CFrameWnd) // OnPaint()가 구현된 클래스와 부모클래스를 인수로 사용하는듯
ON_WM_PAINT() // WM_PAINT와 OnPaint()를 연결시켜주는 역활
ON_WM_LBUTTONDOWN() // WM_LBUTTONDOWN 과 OnLButtonDown() 연결
END_MESSAGE_MAP() |
cs |
SDK 기본코드
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 |
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("HelloClass");
if (!RegisterClass(&wc))
return -1;
hWnd = CreateWindow(TEXT("HelloClass"), TEXT("HelloSDK 프로그램"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
TCHAR* str = TEXT("Hello, SDK");
switch (msg)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 100, 100, str, lstrlen(str));
break;
case WM_LBUTTONDOWN:
MessageBox(hWnd, TEXT("마우스를 클릭했습니다."), TEXT("마우스 메시지"), MB_OK);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
} |
cs |