본문 바로가기

Application Programming Interface/Microsoft Foundation Class

2. 기본 화면에 메뉴 넣기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
전 편에 올렸던 소스와 달라진 부분 위주로 주석을 올립니다.

stdafx.h로 공통 헤더 설정하기


파일명: stdafx.h

#ifndef __STDAFX_H

#include <afxwin.h>
#include <afxext.h>
#include "resource.h"

#endif

CWinApp를 구현하기


파일명: CTestApp.h

#pragma once

class CTestApp : public CWinApp
{
public:
	CTestApp();

public:
	virtual BOOL InitInstance();

	DECLARE_MESSAGE_MAP()
};

extern CTestApp theApp;

파일명: CTestApp.cpp

#include "stdafx.h"
#include "CTestApp.h"
#include "CMainFrame.h"

CTestApp theApp;

BEGIN_MESSAGE_MAP(CTestApp, CWinApp)
END_MESSAGE_MAP()

CTestApp::CTestApp()
{
}

BOOL CTestApp::InitInstance()
{
	BOOL ret = CWinApp::InitInstance();

	if(ret)
	{
		CMainFrame * lpMainFrame = new CMainFrame();
		lpMainFrame->Create(NULL, TEXT("Hello, World!"));
		lpMainFrame->ShowWindow(SW_SHOW);
		lpMainFrame->UpdateWindow();
		this->m_pMainWnd = lpMainFrame;
	}

	return ret;
}

CFrameWnd로 메인 윈도우 구현


파일명: CMainFrame.h

#pragma once

class CMainFrame : public CFrameWnd
{
private:
	// 윈도우에 넣을 메뉴를 다루는 인스턴스입니다.
	CMenu m_menu;

public:
	CMainFrame();
	~CMainFrame();

protected:
	// 창이 생성될 때 이벤트 핸들러를 재정의합니다.
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

	DECLARE_MESSAGE_MAP()
};

파일명: CMainFrame.cpp

#include "stdafx.h"
#include "CMainFrame.h"

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
END_MESSAGE_MAP()

CMainFrame::CMainFrame()
{
	CFrameWnd::CFrameWnd();
}

CMainFrame::~CMainFrame()
{
}

// 창이 생성될 때 처리할 내용이 담긴 이벤트 핸들러를 구현합니다.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	// 작업에 앞서 부모 클래스의 OnCreate를 먼저 호출합니다. 그 반환값을 이 메서드의 반환값으로 삼습니다.
	int ret = CFrameWnd::OnCreate(lpCreateStruct);
	// assert를 위한 임시 변수입니다.
	BOOL assert;

	if(ret != -1)
	{
		// 리소스 상 메뉴의 이름은 IDR_MENU1입니다. 이 이름의 리소스를 LoadMenu 메서드를 통해 불러옵니다.
		// LoadMenu 메서드는 리소스로부터 지정한 메뉴를 불러오는데 성공하면 TRUE, 그렇지 않다면 FALSE를 반환합니다.
		// 뒤이어 실행되는 ASSERT는 메서드의 반환 값이 TRUE인지 FALSE인지를 판단하여
		// FALSE이면 프로그램을 중지하여 디버거가 이 위치를 추적해올 수 있도록 합니다.
		assert = this->m_menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU1)); ASSERT(assert);
		// 불러온 메뉴를 이 창의 메뉴로 설정합니다.
		this->SetMenu(&this->m_menu);
	}

	return ret;
}

실행 결과

메뉴 리소스 IDR_MENU1은 아래와 같은 모양으로 만들었습니다.

SetMenu를 통해 리소스 메뉴가 창 메뉴로 사용되었습니다.