MFC

메뉴 리소스 편집 및 핸들러 등록

윤주승 2025. 4. 7. 16:20

소프트웨어 관점에서 기능의 목록들이 메뉴이다.

메뉴 리소스 편집

  • Visual Studio가 제공하는 가장 비주얼한 기능
  • '리소스 뷰'가 보이도록 VS UI 설정변경
  • 리소스 목록은 .rc 파일을 시각화 한 것
    - rc파일은 고유 문법을 갖는 스크립트 파일
  • 리소스 데이터는 프로젝트 파일 아래 res 폴더에 위치
    - .ico, .bmp

핸들러 등록

  • 여러 방법이 있으며 어떤 것을 사용하더라도 무방
  • 핸들러를 등록 할 클래스 선택 후 속성에서 추가
    - 메뉴, 메시지 핸들러, 각종 가상 함수
  • 수작업 가능
  • 기본적으로 메뉴는 View에 등록
  • 다중 View 환경에서 핸들러가 없는 메뉴는 자동으로 Disable

메뉴를 만들게되면 WM_COMMAND 메시지가 발생한다. 여기에 파라미터로 ID가 딸려간다.

메뉴는 각각 고유한 ID를 갖게되는데 어떤 메뉴인지 판별하기위해 ID를 사용한다.

리소스뷰에서 메뉴에 해당하는 부분과 F5를 눌러서 컴파일 돌렸을때의 창의 화면이 같다.

여기에 입력 하는 부분에 Start 메뉴를 추가해주고, 속성을 들어가서 ID값을 확인해보았다.

 ID_Test_Start 상수 정의가 돼있다.

확인해보려면 솔루션 탐색기에서 Resource.h에

#define ID_TEST_START                   32771

이렇게 상수 정의가 된것을 확인할 수 있다.

이벤트 처리기를 추가하는 방법이다.

어떤 클래스에 넣을 지 정할 수 있는데, 나는 View클래스에 넣을 것이다.

이후, OnTestStart 메뉴가 선택이 되면 이떄 이벤트 처리기에 핸들러 함수가 호출 된다.

이벤트 처리기를 추가하고 텍스트가 정상적으로 출력되는 모습이다.

 

Start가 아닌 Stop도 추가를 해주고, ID 값은 ID_TEST_STOP으로 생성되었다.

이벤트 처리기를 추가하는 또 다른 방법 으로 클래스 뷰에서 이벤트를 클릭한다. 속성에서 이벤트를 보면 방금 추가한 ID값이 추가된것을 확인할 수 있다. 단, 이 방법을 사용할 경우 함수 이름을 변경할 수 없다고 한다.

 

등록된 핸들러 삭제

  • 실수로 잘못 등록한 핸들러를 삭제 할 때는 가급적 수작업으로 삭제를 완료
    - 함수선언 삭제 (.h)
    - 메시지 맵 수정 (.cpp)
    - 함수정의 삭제 (.cpp)
  • 핸들러를 그대로 두고 리소스만 삭제 하는 것도 가능하지만 바람직하지 않음

위에서 이벤트 처리기를 추가할 때 View클래스에 추가를 했다. 만약 뷰가 아닌 다이얼로그 클래스에 추가할 경우 아예 클릭 조차 못하는 상황이 생긴다.

삭제 할때는 클래스 뷰 속성에서 Delete를 하면 지울 수는 있는데 지울땐 3군데를 건드려야 한다.

함수 정의
메세지 맵

남은 처리기 함수도 삭제해주면된다.

그러면 다이얼로그가 아닌 메인 프레임에 NewTest라는 이름으로 새로 추가를 해보자.

정상 작동한다.

그러고 메뉴 버튼에서 New Test를 Delete키를 눌러서 실수로 삭제했다고 가정하자.

그래도 오류가 발생하지않고 정상 작동한다.

만약 다른사람이 이걸 모르고 새로 추가해서 사용할 경우 혼란이 올 수 있으니 연관돼있는 다음과 같은 3가지는 모두 지워야한다 .

	ON_COMMAND(ID_TEST_NEWTEST, &CMainFrame::OnTestNewtest)
void CMainFrame::OnTestNewtest()
{
	AfxMessageBox(_T("Test New Test"));
}
public:
	afx_msg void OnTestNewtest();
};
// 헤더