메뉴 정보
메뉴는 애플리케이션에 대한 옵션 또는 옵션 그룹(하위 메뉴)을 지정하는 항목 목록입니다. 메뉴 항목을 클릭하면 하위 메뉴가 열리거나 애플리케이션이 명령을 수행합니다. 이 섹션에서는 다음 항목에 대한 정보를 제공합니다.
메뉴 모음 및 메뉴
메뉴가 계층 구조에 정렬됩니다. 계층의 최상위 수준에는 메뉴 모음이 있습니다. 메뉴 모음에는 메뉴 목록이 포함되어 있으며, 이 메뉴에는 하위 메뉴가 포함될 수 있습니다. 메뉴 모음을 최상위 메뉴라고도 하며 메뉴와 하위 메뉴를 팝업 메뉴라고도 합니다.
메뉴 항목은 명령을 수행하거나 하위 메뉴를 열 수 있습니다. 명령을 수행하는 항목을 명령 항목 또는 명령이라고 합니다.
메뉴 모음의 항목은 거의 항상 메뉴를 엽니다. 메뉴 모음에는 명령 항목이 거의 포함되지 않습니다. 메뉴 모음에서 열린 메뉴는 메뉴 모음에서 드롭다운되며 드롭다운 메뉴라고도 합니다. 드롭다운 메뉴가 표시되면 메뉴 모음에 연결됩니다. 메뉴 모음에서 드롭다운 메뉴를 여는 메뉴 항목을 메뉴 이름이라고도 합니다.
메뉴 모음의 메뉴 이름은 애플리케이션에서 제공하는 명령의 기본 범주를 나타냅니다. 메뉴 모음에서 메뉴 이름을 선택하면 일반적으로 메뉴 항목이 범주의 명령에 해당하는 메뉴가 열립니다. 예를 들어 메뉴 모음에는 사용자가 클릭하면 새로 만들기, 열기 및 저장과 같은 메뉴 항목이 있는 메뉴를 활성화하는 파일 메뉴 이름이 포함될 수 있습니다. 메뉴 모음에 대한 정보를 얻으려면 GetMenuBarInfo를 호출합니다.
겹치거나 팝업 창에만 메뉴 모음이 포함될 수 있습니다. 자식 창에는 자식 창이 포함될 수 없습니다. 창에 제목 표시줄이 있는 경우 시스템은 메뉴 모음 바로 아래에 메뉴 모음을 배치합니다. 메뉴 모음은 항상 표시됩니다. 그러나 하위 메뉴는 사용자가 활성화하는 메뉴 항목을 선택할 때까지 표시되지 않습니다. 겹치는 창과 팝업 창에 대한 자세한 내용은 창 유형을 참조 하세요.
각 메뉴에는 소유자 창이 있어야 합니다. 사용자가 메뉴를 선택하거나 메뉴에서 항목을 선택하면 시스템에서 메뉴의 소유자 창으로 메시지를 보냅니다.
이 섹션에서는 다음 항목을 설명합니다.
바로 가기 메뉴
시스템은 바로 가기 메뉴도 제공합니다. 바로 가기 메뉴가 메뉴 모음에 연결되어 있지 않습니다. 화면의 아무 곳에나 표시할 수 있습니다. 애플리케이션은 일반적으로 바로 가기 메뉴를 클라이언트 영역과 같은 창의 일부 또는 아이콘과 같은 특정 개체와 연결합니다. 이러한 이유로 이러한 메뉴를 상황에 맞는 메뉴라고 도 합니다.
바로 가기기본 메뉴는 사용자가 활성화할 때까지 다시 숨겨지며, 일반적으로 선택 영역, 도구 모음 또는 작업 표시줄 단추를 마우스 오른쪽 단추로 클릭합니다. 메뉴는 일반적으로 캐리트 또는 마우스 커서의 위치에 표시됩니다.
창 메뉴
창 메뉴(시스템 메뉴 또는 컨트롤 메뉴라고도 함)는 운영 체제에서 거의 독점적으로 정의하고 관리하는 팝업 메뉴입니다. 사용자는 제목 표시줄에서 애플리케이션 아이콘을 클릭하거나 제목 표시줄의 아무 곳이나 마우스 오른쪽 단추로 클릭하여 창 메뉴를 열 수 있습니다.
창 메뉴는 사용자가 창의 크기 또는 위치를 변경하거나 애플리케이션을 닫도록 선택할 수 있는 표준 메뉴 항목 집합을 제공합니다. 창 메뉴의 항목을 추가, 삭제 및 수정할 수 있지만 대부분의 애플리케이션은 표준 메뉴 항목 집합만 사용합니다. 겹치는 팝업 또는 자식 창에는 창 메뉴가 있을 수 있습니다. 겹치거나 팝업 창에 창 메뉴가 포함되지 않는 것은 드문 일입니다.
사용자가 창 메뉴에서 명령을 선택하면 시스템에서 메뉴의 소유자 창에 WM_SYSCOMMAND 메시지를 보냅니다. 대부분의 애플리케이션에서 창 프로시저는 창 메뉴에서 메시지를 처리하지 않습니다. 대신 단순히 메시지의 시스템 기본 처리를 위해 메시지를 DefWindowProc 함수에 전달합니다. 애플리케이션이 창 메뉴에 명령을 추가하는 경우 창 프로시저는 명령을 처리해야 합니다.
애플리케이션은 GetSystemMenu 함수를 사용하여 수정할 기본 창 메뉴의 복사본을 만들 수 있습니다. GetSystemMenu 함수를 사용하여 창 메뉴의 자체 복사본을 만들지 않는 모든 창은 표준 창 메뉴를 받습니다.
도움말 식별자
각 메뉴 모음, 메뉴, 하위 메뉴 및 바로 가기 메뉴와 연결된 도움말 식별자입니다. 메뉴가 활성화된 동안 사용자가 F1 키를 누르면 이 값이 WM_HELP 메시지의 일부로 소유자 창으로 전송됩니다.
메뉴에 대한 키보드 액세스
시스템은 메뉴에 대한 표준 키보드 인터페이스를 제공합니다. 메뉴 항목에 대한 니모닉 액세스 키와 바로 가기(가속기) 키를 제공하여 이 인터페이스를 향상시킬 수 있습니다.
다음 항목에서는 표준 키보드 인터페이스, 액세스 키 및 바로 가기 키에 대해 설명합니다.
표준 키보드 인터페이스
시스템은 마우스 또는 다른 포인팅 디바이스를 사용하거나 사용하지 않고 작동하도록 설계되었습니다. 시스템에서 표준 키보드 인터페이스를 제공하므로 사용자는 키보드를 사용하여 메뉴 항목을 선택할 수 있습니다. 이 키보드 인터페이스에는 특수 코드가 필요하지 않습니다. 사용자가 키보드를 통해 또는 마우스를 사용하여 메뉴 항목을 선택하든 애플리케이션은 명령 메시지를 받습니다. 표준 키보드 인터페이스는 다음 키 입력을 처리합니다.
키 입력 | 작업 |
---|---|
사전순 문자 | 지정된 문자를 액세스 키로 사용하여 첫 번째 메뉴 항목을 선택합니다. 선택한 항목이 메뉴를 호출하면 메뉴가 표시되고 첫 번째 항목이 강조 표시됩니다. 그렇지 않으면 메뉴 항목이 선택됩니다. |
Alt | 메뉴 모음 모드 안팎으로 전환합니다. |
Alt+스페이스바 | 창 메뉴를 표시합니다. |
Enter 키 | 메뉴를 활성화하고 항목에 연결된 메뉴가 있는 경우 첫 번째 메뉴 항목을 선택합니다. 그렇지 않으면 이 키 입력은 항목을 선택하는 동안 사용자가 마우스 단추를 놓은 것처럼 항목을 선택합니다. |
ESC 키 | 메뉴 모드를 종료합니다. |
왼쪽 화살표 | 이전 최상위 메뉴 항목으로 순환합니다. 최상위 메뉴 항목에는 메뉴 이름과 창 메뉴가 포함됩니다. 선택한 항목이 메뉴에 있는 경우 메뉴의 이전 열이 선택되거나 이전 최상위 메뉴 항목이 선택됩니다. |
오른쪽 화살표 | 반대 방향을 제외하고 왼쪽 화살표 키처럼 작동합니다. 메뉴에서 이 키 입력은 한 열 앞으로 이동합니다. 현재 선택한 항목이 맨 오른쪽 열에 있으면 다음 메뉴가 선택됩니다. |
위쪽 또는 아래쪽 화살표 | 메뉴 이름을 누르면 메뉴를 활성화합니다. 메뉴에서 누르면 위쪽 화살표 키 입력이 이전 항목을 선택합니다. 아래쪽 화살표 키 입력에서 다음 항목을 선택합니다. |
메뉴 액세스 키
메뉴 항목에 액세스 키(니모닉)를 추가하여 메뉴의 표준 키보드 인터페이스를 향상시킬 수 있습니다. 액세스 키는 메뉴 항목의 텍스트에 밑줄이 그은 문자입니다. 메뉴가 활성화된 경우 사용자는 항목의 밑줄이 그은 문자에 해당하는 키를 눌러 메뉴 항목을 선택할 수 있습니다. 사용자가 ALT 키를 눌러 메뉴 모음의 첫 번째 항목을 강조 표시하여 메뉴 모음을 활성화합니다. 메뉴가 표시되면 활성화됩니다.
메뉴 항목에 대한 액세스 키를 만들려면 항목의 텍스트 문자열에 앰퍼샌드가 있는 문자 앞에 옵니다. 예를 들어 텍스트 문자열 "&Move"를 사용하면 시스템에서 문자 "M"에 밑줄을 긋습니다.
메뉴 바로 가기 키
액세스 키가 있는 것 외에도 메뉴 항목에는 연결된 바로 가기 키가 있을 수 있습니다. 바로 가기 키가 작동하려면 메뉴가 활성 상태일 필요가 없으므로 바로 가기 키가 선택키와 다릅니다. 또한 액세스 키는 항상 메뉴 항목과 연결되지만, 바로 가기 키는 일반적으로 메뉴 항목과 연결되어 있지만 그럴 필요는 없습니다.
바로 가기 키를 식별하는 텍스트가 메뉴 항목 텍스트 문자열에 추가됩니다. 바로 가기 텍스트는 백슬래시 및 탭 문자(\t) 뒤의 메뉴 항목 이름 오른쪽에 나타납니다. 예를 들어 "&Close\tAlt+F4"는 ALT+F4 키 조합을 바로 가기 키로 사용하고 문자 "C"를 액세스 키로 사용하는 Close 명령을 나타냅니다. 자세한 내용은 키보드 가속기를 참조 하세요.
메뉴 만들기
메뉴 템플릿 또는 메뉴 만들기 함수를 사용하여 메뉴를 만들 수 있습니다. 메뉴 템플릿은 일반적으로 리소스로 정의됩니다. 메뉴 템플릿 리소스를 명시적으로 로드하거나 창 클래스의 기본 메뉴로 할당할 수 있습니다. 메모리에 동적으로 메뉴 템플릿 리소스를 만들 수도 있습니다.
다음 항목에서는 메뉴 만들기에 대해 자세히 설명합니다.
메뉴 템플릿 리소스
대부분의 애플리케이션은 메뉴 템플릿 리소스를 사용하여 메뉴를 만듭니다. 메뉴 템플릿은 메뉴 모음의 항목과 모든 메뉴를 포함하여 메뉴를 정의합니다. 메뉴 템플릿 리소스를 만드는 방법에 대한 자세한 내용은 개발 도구에 포함된 설명서를 참조하세요.
메뉴 템플릿 리소스를 만들고 애플리케이션의 실행 파일(.exe)에 추가한 후 LoadMenu 함수를 사용하여 리소스를 메모리에 로드할 수 있습니다. 이 함수는 SetMenu 함수를 사용하여 창에 할당할 수 있는 메뉴에 대한 핸들을 반환합니다. 자식 창이 아닌 모든 창에 메뉴를 할당할 수 있습니다.
메뉴를 리소스로 구현하면 애플리케이션이 여러 국가/지역에서 사용하기 위해 보다 쉽게 지역화할 수 있습니다. 리소스 정의 파일만 애플리케이션의 소스 코드가 아니라 각 언어에 대해 지역화해야 합니다.
메모리의 메뉴 템플릿
런타임에 메모리에 빌드된 메뉴 템플릿에서 메뉴를 만들 수 있습니다. 예를 들어 사용자가 메뉴를 사용자 지정할 수 있는 애플리케이션은 사용자의 기본 설정에 따라 메모리에 메뉴 템플릿을 만들 수 있습니다. 그러면 애플리케이션은 나중에 사용하기 위해 파일 또는 레지스트리에 템플릿을 저장할 수 있습니다. 메모리의 템플릿에서 메뉴를 만들려면 LoadMenuIndirect 함수를 사용합니다. 메뉴 템플릿 형식에 대한 설명은 메뉴 템플릿 리소스를 참조 하세요.
표준 메뉴 템플릿은 MENUITEMTEMPLATEHEADER 구조와 하나 이상의 MENUITEMTEMPLATE 구조로 구성됩니다.
확장 메뉴 템플릿은 MENUEX_TEMPLATE_HEADER 구조와 하나 이상의 MENUEX_TEMPLATE_ITEM 구조로 구성됩니다.
메뉴 핸들
시스템은 각 메뉴에 고유한 핸들을 생성합니다. 메뉴 핸들은 HMENU 유형의 값입니다. 애플리케이션은 여러 메뉴 함수에서 메뉴 핸들을 지정해야 합니다. 메뉴를 만들거나 메뉴 리소스를 로드할 때 메뉴 모음에 대한 핸들을 받습니다.
만들거나 로드한 메뉴의 메뉴 모음에 대한 핸들을 검색하려면 GetMenu 함수를 사용합니다. 메뉴 항목과 연결된 하위 메뉴에 대한 핸들을 검색하려면 GetSubMenu 또는 GetMenuItemInfo 함수를 사용합니다. 창 메뉴에 대한 핸들을 검색하려면 GetSystemMenu 함수를 사용합니다.
메뉴 만들기 함수
메뉴 만들기 함수를 사용하여 런타임에 메뉴를 만들거나 기존 메뉴에 메뉴 항목을 추가할 수 있습니다. CreateMenu 함수를 사용하여 빈 메뉴 모음을 만들고 CreatePopupMenu 함수를 사용하여 빈 메뉴를 만들 수 있습니다. MENUINFO 구조를 사용하여 메뉴에 대한 특정 설정 정보를 저장할 수 있습니다. 메뉴 설정을 얻거나 검색하려면 GetMenuInfo 또는 SetMenuInfo를 사용합니다. 메뉴에 항목을 추가하려면 InsertMenuItem 함수를 사용합니다. 이전 AppendMenu 및 InsertMenu 함수는 여전히 지원되지만 새 애플리케이션에는 InsertMenuItem을 사용해야 합니다.
메뉴 표시
메뉴를 로드하거나 만든 후에는 시스템에서 표시하기 전에 창에 할당해야 합니다. 클래스 메뉴를 정의하여 메뉴를 할당할 수 있습니다. 자세한 내용은 창 클래스 메뉴를 참조 하세요. 메뉴에 대한 핸들을 CreateWindow 또는 CreateWindowEx 함수의 hMenu 매개 변수로 지정하거나 SetMenu 함수를 호출하여 창에 메뉴를 할당할 수도 있습니다.
바로 가기 메뉴를 표시하려면 TrackPopupMenuEx 함수를 사용합니다. 부동 팝업 메뉴 또는 상황에 맞는 메뉴라고도 하는 바로 가기 메뉴는 일반적으로 WM_CONTEXTMENU 메시지가 처리될 때 표시됩니다.
자식 창이 아닌 모든 창에 메뉴를 할당할 수 있습니다.
이전 TrackPopupMenu 함수는 여전히 지원되지만 새 애플리케이션은 TrackPopupMenuEx 함수를 사용해야 합니다.
창 클래스 메뉴
창 클래스를 등록할 때 클래스 메뉴라는 기본 메뉴를 지정할 수 있습니다. 이렇게 하려면 클래스를 등록하는 데 사용되는 WNDCLASS 구조체의 lpszMenuName 멤버에 메뉴 템플릿 리소스의 이름을 할당합니다.
기본적으로 모든 창에는 해당 창 클래스에 대한 클래스 메뉴가 할당되므로 메뉴를 명시적으로 로드하고 각 창에 할당할 필요가 없습니다. CreateWindowEx 함수 호출에서 다른 메뉴 핸들을 지정하여 클래스 메뉴를 재정의할 수 있습니다. SetMenu 함수를 사용하여 창 메뉴를 만든 후 변경할 수도 있습니다. 자세한 내용은 Window 클래스를 참조하세요.
메뉴 항목
다음 항목에서는 사용자가 메뉴 항목을 선택할 때 시스템에서 수행하는 작업과 애플리케이션이 항목의 모양과 기능을 제어할 수 있는 방법에 대해 설명합니다.
- 하위 메뉴가 열리는 명령 항목 및 항목
- 메뉴 항목 식별자
- 메뉴 항목 위치
- 프로그래밍 방식으로 메뉴 항목 액세스
- 기본 메뉴 항목
- 선택한 메뉴 항목 및 선택 취소
- 사용, 회색 및 사용 안 함 메뉴 항목
- 강조 표시된 메뉴 항목
- 소유자가 그린 메뉴 항목
- 메뉴 항목 구분 기호 및 줄 바꿈
하위 메뉴가 열리는 명령 항목 및 항목
사용자가 명령 항목을 선택하면 시스템은 메뉴를 소유한 창에 명령 메시지를 보냅니다. 명령 항목이 창 메뉴에 있으면 시스템에서 WM_SYSCOMMAND 메시지를 보냅니다. 그렇지 않으면 WM_COMMAND 메시지를 보냅니다.
하위 메뉴를 여는 각 메뉴 항목과 연결된 것은 해당 하위 메뉴에 대한 핸들입니다. 사용자가 이러한 항목을 가리키면 시스템에서 하위 메뉴가 열립니다. 소유자 창에 명령 메시지가 전송되지 않습니다. 그러나 시스템은 하위 메뉴가 표시되기 전에 소유자 창에 WM_INITMENUPOPUP 메시지를 보냅니다. GetSubMenu 또는 GetMenuItemInfo 함수를 사용하여 항목과 연결된 하위 메뉴에 대한 핸들을 가져올 수 있습니다.
메뉴 모음은 일반적으로 메뉴 이름을 포함하지만 명령 항목을 포함할 수도 있습니다. 하위 메뉴는 일반적으로 명령 항목을 포함하지만 중첩된 하위 메뉴가 열리는 항목을 포함할 수도 있습니다. 하위 메뉴에 이러한 항목을 추가하여 메뉴를 깊이에 중첩할 수 있습니다. 사용자에게 시각적 신호를 제공하기 위해 시스템은 하위 메뉴를 여는 메뉴 항목의 텍스트 오른쪽에 작은 화살표를 자동으로 표시합니다.
메뉴 항목 식별자
각 메뉴 항목과 연결된 고유한 애플리케이션 정의 정수(메뉴 항목 식별자)입니다. 사용자가 메뉴에서 명령 항목을 선택하면 시스템에서 WM_COMMAND 메시지의 일부로 항목의 식별자를 소유자 창으로 보냅니다. 창 프로시저는 식별자를 검사하여 메시지의 원본을 확인하고 그에 따라 메시지를 처리합니다. 또한 메뉴 함수를 호출할 때 해당 식별자를 사용하여 메뉴 항목을 지정할 수 있습니다. 예를 들어 메뉴 항목을 사용하거나 사용하지 않도록 설정합니다.
하위 메뉴를 여는 메뉴 항목에는 명령 항목과 마찬가지로 식별자가 있습니다. 그러나 메뉴에서 이러한 항목을 선택하면 시스템에서 명령 메시지를 보내지 않습니다. 대신, 시스템은 메뉴 항목과 연결된 하위 메뉴를 엽니다.
지정된 위치에서 메뉴 항목의 식별자를 검색하려면 GetMenuItemID 또는 GetMenuItemInfo 함수를 사용합니다.
메뉴 항목 위치
고유한 식별자를 갖는 것 외에도 메뉴 모음 또는 메뉴의 각 메뉴 항목에는 고유한 위치 값이 있습니다. 메뉴 모음의 맨 왼쪽 항목 또는 메뉴의 맨 위 항목에는 위치가 0입니다. 위치 값은 후속 메뉴 항목에 대해 증가합니다. 시스템은 구분 기호를 포함하여 메뉴의 모든 항목에 위치 값을 할당합니다. 다음 그림에서는 메뉴 모음 및 메뉴에 있는 항목의 위치 값을 보여 줍니다.
특정 메뉴 항목에 대한 정보를 수정하거나 검색하는 메뉴 함수를 호출할 때 해당 식별자 또는 위치를 사용하여 항목을 지정할 수 있습니다. 자세한 내용은 다음 섹션을 참조하세요.
프로그래밍 방식으로 메뉴 항목 액세스
대부분의 메뉴 함수를 사용하면 위치 또는 명령으로 메뉴 항목을 지정할 수 있습니다. 일부 함수는 MF_BYPOSITION 및 MF_BYCOMMAND 플래그를 사용하여 검색 알고리즘을 나타내고, 다른 함수에는 명시적 fByPosition 매개 변수가 있습니다. 위치별로 메뉴 항목을 지정하는 경우 항목 번호는 메뉴의 인덱스(0부터 시작)입니다. 명령으로 메뉴 항목을 지정하는 경우 메뉴와 해당 하위 메뉴는 메뉴 식별자가 제공된 항목 번호와 같은 항목을 검색합니다. 메뉴 계층 구조에서 둘 이상의 항목이 항목 번호와 일치하는 경우 어떤 항목이 사용되는지 지정되지 않습니다. 메뉴에 중복 메뉴 식별자가 포함된 경우 위치 기반 메뉴 작업을 사용하여 이러한 모호성을 방지해야 합니다.
기본 메뉴 항목
하위 메뉴에는 하나의 기본 메뉴 항목이 포함될 수 있습니다. 사용자가 두 번 클릭하여 하위 메뉴를 열면 시스템은 메뉴의 소유자 창에 명령 메시지를 보내고 기본 명령 항목이 선택된 것처럼 메뉴를 닫습니다. 기본 명령 항목이 없으면 하위 메뉴가 다시 기본 열립니다. 하위 메뉴의 기본 항목을 검색하고 설정하려면 GetMenuDefaultItem 및 SetMenuDefaultItem 함수를 사용합니다.
선택한 메뉴 항목 및 선택 취소
메뉴 항목을 선택하거나 지울 수 있습니다. 시스템에서 선택한 메뉴 항목 옆에 비트맵을 표시하여 선택한 상태를 나타냅니다. 애플리케이션에서 정의한 "clear" 비트맵을 지정하지 않으면 시스템에서 지우기 항목 옆에 비트맵을 표시하지 않습니다. 메뉴의 메뉴 항목만 선택할 수 있습니다. 메뉴 모음의 항목을 선택할 수 없습니다.
애플리케이션은 일반적으로 옵션이 적용되는지 여부를 나타내기 위해 메뉴 항목을 검사 또는 선택을 취소합니다. 예를 들어 애플리케이션에 메뉴의 도구 모음 명령을 사용하여 사용자가 표시하거나 숨길 수 있는 도구 모음 이 있다고 가정합니다. 도구 모음을 숨기 면 도구 모음 메뉴 항목이 명확합니다. 사용자가 명령을 선택하면 애플리케이션이 메뉴 항목을 검사 도구 모음을 표시합니다.
검사 표시 특성은 메뉴 항목이 선택되었는지 여부를 제어합니다. CheckMenuItem 함수를 사용하여 메뉴 항목의 검사 표시 특성을 설정할 수 있습니다. GetMenuState 함수를 사용하여 메뉴 항목이 현재 선택 또는 지워지는지 여부를 확인할 수 있습니다.
CheckMenuItem 및 GetMenuState 대신 GetMenuItemInfo 및 SetMenuItemInfo 함수를 사용하여 메뉴 항목의 검사 상태를 검색하고 설정할 수 있습니다.
경우에 따라 메뉴 항목 그룹은 상호 배타적인 옵션 집합에 해당합니다. 이 경우 선택한 라디오 메뉴 항목(라디오 단추 컨트롤과 유사)을 사용하여 선택한 옵션을 나타낼 수 있습니다. 선택한 라디오 항목은 검사 표시 비트맵 대신 글머리 기호 비트맵으로 표시됩니다. 메뉴 항목을 검사 라디오 항목으로 만들려면 CheckMenuRadioItem 함수를 사용합니다.
기본적으로 시스템은 선택한 메뉴 항목 옆에 검사 표시 또는 글머리 기호 비트맵을 표시하고 삭제된 메뉴 항목 옆에 비트맵을 표시하지 않습니다. 그러나 SetMenuItemBitmaps 함수를 사용하여 애플리케이션에서 정의한 선택 및 지운 비트맵을 메뉴 항목과 연결할 수 있습니다. 그런 다음, 시스템은 지정된 비트맵을 사용하여 메뉴 항목의 선택됨 또는 지운 상태를 나타냅니다.
메뉴 항목과 연결된 애플리케이션 정의 비트맵은 기본 검사 표시 비트맵과 크기가 같아야 하며, 크기는 화면 해상도에 따라 달라질 수 있습니다. 올바른 차원을 검색하려면 GetSystemMetrics 함수를 사용합니다. 다양한 화면 해상도에 대해 여러 비트맵 리소스를 만들 수 있습니다. 하나의 비트맵 리소스를 만들고 필요한 경우 크기를 조정합니다. 또는 런타임에 비트맵을 만들고 그 안에 이미지를 그립니다. 비트맵은 단색 또는 색일 수 있습니다. 그러나 메뉴 항목이 강조 표시될 때 반전되므로 반전된 특정 색 비트맵의 모양은 바람직하지 않을 수 있습니다. 자세한 내용은 비트맵을 참조 하세요.
사용, 회색 및 사용 안 함 메뉴 항목
메뉴 항목을 사용하거나, 회색으로 설정하거나, 사용하지 않도록 설정할 수 있습니다. 기본적으로 메뉴 항목은 사용하도록 설정됩니다. 사용자가 활성화된 메뉴 항목을 선택하면 시스템에서 명령 메시지를 소유자 창으로 보내거나 메뉴 항목의 종류에 따라 해당 하위 메뉴를 표시합니다.
사용자가 메뉴 항목을 사용할 수 없는 경우 회색으로 표시하거나 사용하지 않도록 설정해야 합니다. 회색 및 비활성화된 메뉴 항목을 선택할 수 없습니다. 사용하지 않도록 설정된 항목은 활성화된 항목처럼 보입니다. 사용자가 비활성화된 항목을 클릭하면 항목이 선택되지 않고 아무 작업도 수행되지 않습니다. 비활성화된 항목은 활성화된 것처럼 보이지만 그렇지 않은 메뉴를 제공하는 자습서와 같이 유용할 수 있습니다.
애플리케이션은 명령을 사용할 수 없다는 시각적 신호를 사용자에게 제공하기 위해 사용할 수 없는 메뉴 항목을 회색으로 표시합니다. 작업이 적절하지 않은 경우 회색 항목을 사용할 수 있습니다(예: 시스템에 프린터가 설치되어 있지 않은 경우 파일 메뉴에서 인쇄 명령을 회색으로 표시할 수 있습니다).
EnableMenuItem 함수는 메뉴 항목을 사용하거나, 회색으로 설정하거나, 사용하지 않도록 설정합니다. 메뉴 항목이 사용, 회색 또는 비활성화되었는지 여부를 확인하려면 GetMenuItemInfo 함수를 사용합니다.
GetMenuItemInfo 대신 GetMenuState 함수를 사용하여 메뉴 항목이 활성화, 회색 또는 비활성화되었는지 여부를 확인할 수도 있습니다.
강조 표시된 메뉴 항목
사용자가 메뉴 항목을 선택하면 시스템에서 메뉴 항목을 자동으로 강조 표시합니다. 그러나 HiliteMenuItem 함수를 사용하여 메뉴 모음의 메뉴 이름에서 강조 표시를 명시적으로 추가하거나 제거할 수 있습니다. 이 함수는 메뉴의 메뉴 항목에 영향을 주지 않습니다. 하지만 HiliteMenuItem을 사용하여 메뉴 이름을 강조 표시하면 이름이 선택된 것만 나타납니다. 사용자가 Enter 키를 누르면 강조 표시된 항목이 선택되지 않습니다. 이 기능은 예를 들어 메뉴 사용을 보여 주는 학습 애플리케이션에서 유용할 수 있습니다.
소유자가 그린 메뉴 항목
애플리케이션은 소유자가 그린 항목을 사용하여 메뉴 항목의 모양을 완전히 제어할 수 있습니다. 소유자가 그린 항목은 애플리케이션이 선택한 상태(강조 표시), 선택됨 및 지운 상태를 그리는 데 총 책임을 져야 합니다. 예를 들어 애플리케이션에서 글꼴 메뉴를 제공한 경우 해당 글꼴을 사용하여 각 메뉴 항목을 그릴 수 있습니다. 로마의 항목은 로마로 그려집니다, 기울임꼴에 대한 항목은 기울임꼴로 그려집니다, 등등. 자세한 내용은 소유자 그리기 메뉴 항목 만들기를 참조 하세요.
메뉴 항목 구분 기호 및 줄 바꿈
시스템은 가로줄로 표시되는 구분 기호라는 특수한 유형의 메뉴 항목을 제공합니다. 구분 기호를 사용하여 메뉴를 관련 항목 그룹으로 나눌 수 있습니다. 메뉴 모음에서 구분 기호를 사용할 수 없으며 사용자가 구분 기호를 선택할 수 없습니다.
메뉴 모음에 한 줄에 맞는 것보다 더 많은 메뉴 이름이 포함된 경우 시스템은 메뉴 모음을 두 개 이상의 줄로 자동으로 분리하여 메뉴 모음을 래핑합니다. 항목에 MFT_MENUBREAK 형식 플래그를 할당하여 메뉴 모음의 특정 항목에서 줄 바꿈이 발생할 수 있습니다. 시스템은 해당 항목과 모든 후속 항목을 새 줄에 배치합니다.
메뉴에 한 열에 맞는 것보다 많은 항목이 포함되어 있으면 메뉴가 잘립니다. 메뉴의 특정 항목에서 항목에 MFT_MENUBREAK 형식 플래그를 할당하거나 MENUITEM 문의 MENUBREAK 옵션을 사용하여 열 나누기가 발생할 수 있습니다. 시스템은 해당 항목과 모든 후속 항목을 새 열에 배치합니다. MFT_MENUBARBREAK 형식 플래그는 새 열과 이전 열 사이에 세로선이 나타나는 것을 제외하고는 동일한 효과를 줍니다.
AppendMenu, InsertMenu 또는 ModifyMenu 함수를 사용하여 줄 바꿈을 할당하는 경우 MF_MENUBREAK 또는 MF_MENUBARBREAK 형식 플래그를 할당해야 합니다.
메뉴와 함께 사용되는 메시지
시스템은 메뉴를 소유한 창의 창 프로시저로 메시지를 전송하여 메뉴 관련 작업을 보고합니다. 사용자가 메뉴 모음에서 항목을 선택하거나 마우스 오른쪽 단추를 클릭하여 바로 가기 메뉴를 표시할 때 시스템에서 일련의 메시지를 보냅니다.
사용자가 메뉴 모음에서 항목을 활성화하면 소유자 창이 먼저 WM_SYSCOMMAND 메시지를 받습니다. 이 메시지에는 사용자가 키보드(SC_KEYMENU) 또는 마우스(SC_MOUSEMENU)를 사용하여 메뉴를 활성화했는지 여부를 나타내는 플래그가 포함되어 있습니다. 자세한 내용은 메뉴에 대한 키보드 액세스를 참조 하세요.
다음으로, 메뉴를 표시하기 전에 시스템에서 WM_INITMENU 메시지를 창 프로시저로 보내므로 사용자가 메뉴를 보기 전에 애플리케이션에서 메뉴를 수정할 수 있습니다. 시스템은 메뉴 활성화당 한 번만 WM_INITMENU 메시지를 보냅니다.
사용자가 하위 메뉴를 여는 메뉴 항목을 가리키면 시스템은 하위 메뉴를 표시하기 전에 소유자 창에 WM_INITMENUPOPUP 메시지를 보냅니다. 이 메시지는 애플리케이션이 표시되기 전에 하위 메뉴 수정 기회를 제공합니다.
사용자가 강조 표시를 한 항목에서 다른 항목으로 이동할 때마다 시스템은 메뉴 소유자 창의 창 프로시저에 WM_MENUSELECT 메시지를 보냅니다. 이 메시지는 현재 선택한 메뉴 항목을 식별합니다. 대부분의 애플리케이션은 기본 창 아래쪽에 정보 영역을 제공하고 이 메시지를 사용하여 선택한 메뉴 항목에 대한 추가 정보를 표시합니다.
사용자가 메뉴에서 명령 항목을 선택하면 시스템에서 창 프로시저에 WM_COMMAND 메시지를 보냅니다. WM_COMMAND 메시지의 wParam 매개 변수의 하위 단어에는 선택한 항목의 식별자가 포함됩니다. 창 프로시저는 식별자를 검사하고 그에 따라 메시지를 처리해야 합니다.
MENUINFO 구조를 사용하여 메뉴에 대한 정보를 저장할 수 있습니다. 메뉴가 MENUINFO로 정의된 경우MNS_NOTIFYBYPOS dwStyle 값으로, 항목이 선택되면 시스템에서 WM_COMMAND 대신 WM_MENUCOMMAND 보냅니다. 이렇게 하면 MENUINFO 구조체의 정보에 액세스할 수 있으며 선택한 항목의 인덱스도 직접 제공합니다.
창의 메뉴 모음을 통해 모든 메뉴에 액세스할 수 있는 것은 아닙니다. 사용자가 특정 위치에서 마우스 오른쪽 단추를 클릭할 때 많은 응용 프로그램에서 바로 가기 메뉴를 표시합니다. 이러한 애플리케이션은 WM_CONTEXTMENU 메시지를 처리하고 적절한 경우 바로 가기 메뉴를 표시해야 합니다. 애플리케이션에 바로 가기 메뉴가 표시되지 않으면 기본 처리를 위해 WM_CONTEXTMENU 메시지를 DefWindowProc 함수에 전달해야 합니다.
커서가 메뉴 항목에 있는 동안 마우스 오른쪽 단추를 놓으면 WM_MENURBUTTONUP 메시지가 전송됩니다. 이 메시지는 애플리케이션 메뉴 항목에 대 한 상황에 맞는 또는 바로 가기 메뉴를 표시할 수 있도록 제공 됩니다.
끌어서 놓기 메뉴만 포함하는 몇 가지 메시지가 있습니다. 마우스 커서가 메뉴 항목에 들어가거나 항목의 가운데에서 항목의 위쪽 또는 아래쪽으로 이동할 때 WM_MENUGETOBJECT 끌어서 놓기 메뉴의 소유자에게 전송됩니다. 사용자가 실제로 메뉴 항목을 끌 때 WM_MENUDRAG 메시지가 전송됩니다.
드롭다운 메뉴 또는 하위 메뉴가 제거되면 시스템에서 WM_UNINITMENUPOPUP 메시지를 보냅니다.
메뉴 소멸
창에 메뉴가 할당되고 해당 창이 제거되면 시스템은 메뉴와 하위 메뉴를 자동으로 삭제하여 메뉴의 핸들과 메뉴가 차지하는 메모리를 해제합니다. 시스템은 창에 할당되지 않은 메뉴를 자동으로 삭제하지 않습니다. 애플리케이션은 DestroyMenu 함수를 호출하여 할당되지 않은 메뉴를 삭제해야 합니다. 그렇지 않으면 애플리케이션을 닫은 후에도 메뉴가 메모리에 계속 존재합니다. 호출 스레드의 활성 메뉴를 종료하려면 EndMenu를 사용합니다. 플랫폼에서 EndMenu를 지원하지 않는 경우 활성 메뉴의 소유자에게 WM_CANCELMODE 메시지를 보냅니다.