리소스 WM_COMMAND

프로그램 실행중에 사용자가 메뉴 항목을 선택하게 되면 WM_COMMAND 메시지가 발생합니다. 이때 어떤 메뉴 항목이 선택되었는지를 wParam의 하위 워드로 전달되기 때문에 LOWORD를 읽어 판단할 수 있습니다. 그래서 Menu.cpp의 WndProc에서는 WM_COMMAND 메시지를 받을 경우 switch문으로 다시 LOWORD의 값에 따라 분기를 하여 각 메뉴 항목에 따른 처리를 수행하게 됩니다. ID_FILE_MENU1 메뉴 항목이 선택되었을 경우 메시지 박스를 열어서 메뉴 항목이 선택되었음을 알려주고 ID_FILE_EXIT 메뉴 항목이 선택되었을 경우 프로그램을 종료합니다. 메뉴 항목이 더 늘어난다면 WM_COMMAND의 switch문 안에 case만 계속 늘려가면 됩니다.


WM_COMMAND 메시지는 메뉴 항목을 선택할 때뿐만 아니라 엑셀러레이터를 누를 때도 발생하며 또한 버튼이나 에디트 박스 등의 컨트롤이 부모 윈도우로 통지 메시지를 보낼 때도 발생하게 됩니다. 이 메시지의 추가 정보는 다음과 같은 구조를 갖습니다. 아주 빈번하게 사용되는 메시지이기 때문에 아래에 나와있는 값은 반드시 암기하는 것이 좋습니다.


  • IParam 통지 메시지를 발생시킨 컨트롤의 윈도우 핸들

  • LOWORD 메뉴나 액셀러레이터, 컨트롤의 ID

  • HIWORD 컨트롤이 보내는 통지 메시지, 메뉴가 선택된 경우는 0이 되며, 액셀러레이터가 선택된 경우는 1이 됩니다.


WM_COMMAND 메시지가 워낙에 여러 가지 명령을 받아들이는 메시지이다 보니 추가 정보도 복잡하게 나타납니다. 여기서 우리가 사용한 값은 메뉴ID가 전달되는 LOWORD뿐이며 통지 메시지니, 컨트롤이니 하는 말들은 당장에 쓸 곳이 없기 때문에 모르고 지나치더라도 상관없습니다. 아무튼 여기서 기억하고 넘어가야 하는 것은 메뉴를 선택할 때 WM_COMMAND 메시지가 전달되며, LOWORD를 읽어서 어떤 메뉴 항목이 선택되었는지를 판단할 수 있다는 점입니다.


메뉴 편집기

메뉴 리소스는 리소스 파일에 텍스트 형태로 작성하는 것을 원칙으로 합니다. 실제로 과거의 프로그래머들은 텍스트 편집기로 메뉴를 만들었었습니다. 하지만 최근에 들어서는 편리한 툴이 많이 개발되었기 때문에 메뉴 리소스를 직접적으로 편집하는 사람은 거의 없으며, 그럴 이유도 없습니다. 비주얼 C++또한 편리한 메뉴 편집기를 제공하여 위지윅 메뉴 편집을 지원하기 때문에 이 편집기의 도움을 받으면 보다 편리하게 메뉴 리소스를 작성할 수 있습니다. 메뉴 편집기는 사용자가 편집한 메뉴를 텍스트 형태로 리소스 파일에 기록합니다. 여기서는 메뉴 자체에 대해서는 잠시 접어두고 메뉴 편집기 사용법을 알아보도록 하겠습니다. 이 사용법은 굉장히 직관적이기 때문에 한번만 확인해보더라도 누구나 쉽게 사용할 수 있습니다. 또한 비주얼 베이직이나 델파이 같은 비주얼 프로그래밍 툴을 사용해본 경험이 있다면 보다 쉽게 익숙해질 것입니다.


새 메뉴의 작성

새로운 메뉴를 작성할 때는 리소스 뷰의 팝업 메뉴에서 리소스 추가 항목을 선택합니다. 아무것도 없는 빈 메뉴를 준비해 줄 것입니다. 이때 새 메뉴의 ID는 이미 만들어 놓은 리소스와 중복되지 않도록 부여되는데 IDR_MENU1이 이미 만들어져 있기 때문에

IDR_MENU2가 될 것입니다. 물론 ID는 언제든지 원하는 값으로 변경할 수 있습니다.

좌상단에 빈칸이 하나 나타나있는데 이 빈칸을 출발점으로 해서 메뉴 항목을 오른쪽이나 아래쪽으로 만들어나가면 됩니다.


메뉴 항목의 추가

빈칸에 새로운 메뉴를 추가하기 위해서는 곧바로 캡션을 입력하거나 빈칸을 더블클릭하여 속성 편집기를 열고 캡션과 기타 속성들을 입력하면 됩니다. 좌상단의 빈칸을 더블클릭하여 파일이라는 캡션을 주면 다음과 같이 됩니다. 오른쪽과 아래쪽에 각각 빈칸이 나타나는데 이 빈칸들에 또 메뉴 항목을 만들면 됩니다. 빈칸에 메뉴를 만들면 또 그 옆에 새로운 빈칸이 나타날 것입니다. 이런 식으로 다음과 같이 메뉴를 생성하면 됩니다.


메뉴 항목의 수정

기존에 이미 작성되어 있는 메뉴의 이름이나 속성을 변경하기 위해서는 속성 편집기에서 원하는 속성을 다시 입력하면 됩니다. 만약 속성 편집기가 닫혀 있다면 언제든지 메뉴 항목을 더블클릭하여 속성 편집기를 불러낼 수 있습니다. 예를 들어서 파일/오픈의 캡션을 리드로 변경하기 위해서는 이 메뉴 항목을 더블클릭한 다음 캡션을 리드로 변경하기만 하면 됩니다. 다른 속성들도 마찬가지 방법으로 언제든지 수정할 수 있습니다.


메뉴 항목의 삽입

기존에 작성되어 있는 메뉴 리스트 가운데 새로운 메뉴 항목을 끼워 넣는 것입니다. 삽입할 위치에 커서를 위치시킨 다음 키보드에서 Ins키를 누르면 커서 위치에 빈칸이 새로 생성되며, 이 빈칸에 원하는 항목을 입력하면 됩니다. 예를 들어서 세이브와 프린트 항목 사이에 뉴 항목을 삽입하기 위해서는 프린트 위치에서 Ins키를 누른 후 뉴를 입력하면 됩니다.


메뉴 항목의 삭제

삭제하고자 하는 메뉴 항목에 커서를 위치시킨 다음 오른손 집게 손가락으로 키보드의 Del 키를 누릅니다. 다만 메뉴 리스트의 메뉴 항목은 그냥 삭제되지만 하위 메뉴를 거느린 팝업 메뉴를 삭제할 때는 바로 삭제하지 않고 다음과 같이 일차 경고가 나타납니다. 팝업 메뉴를 삭제하게 되면 그 아래에 딸린 메뉴들도 모두 한꺼번에 삭제되기 때문에 주의하라는 경고입니다. 만약 실수로 애써 만들어 놓은 메뉴를 망칠까봐 한 번 더 확인하는 것입니다. 비어있지 않은 디렉토리를 지울 때 확인하는 것과 동일합니다. 만약 실수로 지워서는 안 될 메뉴를 지웠다면 에딧/Undo를 선택해서 원상태로 복구할 수 있습니다.

댓글

Designed by JB FACTORY