본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 10 메뉴/바로 가기 키/도구 모음/상태 표시줄


내가 생각해도 챕터 제목 참.. 뭐 직설적이긴 하네.

이번에는 가장 흔한 HelloWorld 예제가 쓰인다.

문제는 프로젝트명을 소문자로 적었다는거. 으.  소문자 하면 졸백같다는 이야기가 뼈저리게 느껴진다.

 
책에서 참조하는  HelloWorld 의 코드

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{//여기부터
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam); //여기까지 굵은 글씨.
// 메뉴의 선택 영역을 구문 분석합니다.
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 여기에 그리기 코드를 추가합니다.
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;


WM_COMMAND 메시지의 wParam파라미터에서 LOWORD()매크로를 이용하여 어떤 메뉴를 선택하였는지 판별함.

 HelloWorld는 그만 보고 새 프로젝트를 작성함.

프로젝트명은 CommandDemo이며 속성은 

 

로 한다. 

1. 리소스 뷰 로 가서 메뉴 리소스를 불러온다[클릭만 하면 됨.]




2. 메뉴의 최우측에 가서
 여기에 입력 을 클릭한 뒤 테스트  메뉴 라고 적어주면 메뉴가 하나 생겨난다.


 3. 마찬가지로 테스트 메뉴의 아래쪽에 클릭  --> 시작 이라고 적어서 메뉴를 추가하고 시작 메뉴의 속성에서
ID를 직접 입력하여 ID_Menu_Start라고 적어준다.
 



4. 같은 방법으로 시작 아래에 종료(ID 는 ID_Menu_Stop) 를 추가해주고 빌드하여 출력화면을 확인한다. 



 
5. 메뉴 선택시 호출할 함수는 CMainFrame 클래스에 작성하려 하므로 다음 스크린샷과 같이 따라가서 추가한다.



위의 스크린샷에서 OnMenuStart를 눌러주면 

MainFrm.cpp에

void CMainFrame::OnMenuStart()
{
// TODO: 여기에 명령 처리기 코드를 추가합니다.
}
라는 코드가 생성되며 해당 위치로 화면이 이동된다.

 

이런 추가 방식은 앞서 자주 사용된 메시지 핸들러 함수를 등록화는 과정과 매우 흡사하다.

OnMenuStart를 추가했듯이 Stop쪽도 추가해주고 

다음과 같이 메시지 박스가 뜨도록 코딩 해준다.


void CMainFrame::OnMenuStart()
{
AfxMessageBox(_T("시작 메뉴를 선택하였습니다."));
}

void CMainFrame::OnMenuStop()
{
AfxMessageBox(_T("종료 메뉴를 선택하였습니다."));
}




                              ㄴ 메뉴 클릭 시 이렇게 메시지박스가 뜬다.



역시 헤더에도 메시지 핸들러를 추가했을때 처럼 

// 생성된 메시지 맵 함수///////////////////////////여기부터
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()

public:
afx_msg void OnMenuStart();
afx_msg void OnMenuStop();
};

///////////////////////굵은글씨.

이렇게 선언이 추가된다.

메시지 맵을 확인하면 역시 특정 메뉴 리소스와 함수를 연결하는 매크로가 자동으로 코딩되어 있는것을 볼 수 있다.


////////////////////////////////////

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(ID_Menu_Start, &CMainFrame::OnMenuStart)
ON_COMMAND(ID_Menu_Stop, &CMainFrame::OnMenuStop)
END_MESSAGE_MAP()


////////////////////////////////////

마지막으로 reaource.h 헤더파일로 가면

메뉴가 선언되어 있음을 알 수 있다.

#define IDD_ABOUTBOX                    100
#define IDP_OLE_INIT_FAILED             100
#define IDR_MAINFRAME                   128
#define IDR_CommandDemoTYPE             130
#define ID_32771                        32771
#define ID_Menu_Start                   32772
#define ID_32773                        32773
#define ID_Menu_Stop                    32774
 

 여기까지 나온 내용 코드.