프로그래밍/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(100100, 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,
        NULLNULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    while (GetMessage(&msg, NULL00> 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, 100100, 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