도움말 메뉴 병합
개체가 컨테이너 내에서 활성 상태이면 OLE 문서의 메뉴 병합 프로토콜을 통해 개체가 도움말 메뉴를 완전히 제어할 수 있습니다. 따라서 사용자가 개체를 비활성화하지 않으면 컨테이너의 도움말 항목을 사용할 수 없습니다. 현재 문서 포함 아키텍처는 현재 위치 메뉴 병합 규칙에서 확장되어 컨테이너와 활성 문서가 모두 메뉴를 공유할 수 있도록 합니다. 새 규칙은 메뉴의 어떤 부분을 소유하는 구성 요소와 공유 메뉴가 생성되는 방식에 대한 추가 규칙일 뿐입니다.
새 규칙은 간단합니다. 현재 문서에서 도움말 메뉴에는 다음과 같이 구성된 두 개의 최상위 메뉴 항목이 있습니다.
Help
Container Help >
Object Help >
예를 들어 Office 바인더에서 Word 섹션이 활성화되면 도움말 메뉴가 다음과 같이 표시됩니다.
Help
Binder Help >
Word Help >
두 메뉴 항목 모두 컨테이너 및 개체와 관련된 추가 메뉴 항목이 사용자에게 제공되는 계단식 메뉴입니다. 여기에 표시되는 항목은 컨테이너 및 관련된 개체에 따라 달라집니다.
이 병합된 도움말 메뉴를 생성하기 위해 현재 문서 포함 아키텍처는 일반 OLE 문서 프로시저를 수정합니다. OLE 문서에 따르면 병합된 메뉴 모음에는 파일, 편집, 컨테이너, 개체, 창, 도움말 등 6개의 메뉴 그룹이 해당 순서대로 있을 수 있습니다. 각 그룹에는 0개 이상의 메뉴가 있을 수 있습니다. 파일, 컨테이너 및 창 그룹은 컨테이너에 속하며 편집, 개체 및 도움말 그룹은 개체에 속합니다. 개체가 메뉴 병합을 수행하려는 경우 빈 메뉴 모음을 만들어 컨테이너에 전달합니다. 그런 다음 컨테이너는 .를 호출 IOleInPlaceFrame::InsertMenus
하여 해당 메뉴를 삽입합니다. 또한 개체는 6개의 LONG 값(OLEMENUGROUPWIDTHS)의 배열인 구조체를 전달합니다. 메뉴를 삽입한 후 컨테이너는 각 그룹에 추가된 메뉴 수를 표시한 다음 반환합니다. 그런 다음 개체가 해당 메뉴를 삽입하여 각 컨테이너 그룹의 메뉴 수에 주의합니다. 마지막으로 개체는 병합된 메뉴 모음과 배열(각 그룹의 메뉴 개수 포함)을 OLE에 전달하여 불투명한 "메뉴 설명자" 핸들을 반환합니다. 나중에 개체는 해당 핸들과 병합된 메뉴 모음을 통해 IOleInPlaceFrame::SetMenu
컨테이너에 전달합니다. 이때 컨테이너는 병합된 메뉴 모음을 표시하고 OLE가 메뉴 메시지의 적절한 디스패치를 수행할 수 있도록 핸들을 OLE에 전달합니다.
수정된 활성 문서 프로시저에서 개체는 먼저 OLEMENUGROUPWIDTHS 요소를 0으로 초기화한 후 컨테이너에 전달해야 합니다. 그런 다음 컨테이너는 한 가지 예외를 제외하고 일반 메뉴 삽입을 수행합니다. 컨테이너는 도움말 메뉴를 마지막 항목으로 삽입하고 OLEMENUGROUPWIDTHS 배열의 마지막(여섯 번째) 항목(즉, 개체의 도움말 그룹에 속하는 width[5])에 값 1을 저장합니다. 이 도움말 메뉴에는 앞에서 설명한 대로 하위 메뉴인 "컨테이너 도움말>" 계단식 메뉴가 하나만 있습니다.
그런 다음 개체는 해당 도움말 메뉴를 삽입하기 전에 OLEMENUGROUPWIDTHS 배열의 여섯 번째 항목을 검사 것을 제외하고 기본 메뉴 삽입 코드를 실행합니다. 값이 1이고 마지막 메뉴의 이름이 도움말(또는 적절한 지역화된 문자열)인 경우 개체는 도움말 메뉴를 컨테이너 도움말 메뉴의 하위 메뉴로 삽입합니다.
그런 다음 개체는 OLEMENUGROUPWIDTHS의 여섯 번째 요소를 0으로 설정하고 다섯 번째 요소를 1씩 증분합니다. 이를 통해 OLE는 도움말 메뉴가 컨테이너에 속하며 해당 메뉴(및 해당 하위 메뉴)에 해당하는 메뉴 메시지를 컨테이너로 라우팅해야 한다는 것을 알 수 있습니다. 그런 다음 도움말 메뉴의 개체 부분에 속하는 WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND 및 기타 메뉴 관련 메시지를 전달해야 합니다. 이 작업은 WM_INITMENU 사용하여 사용자가 개체의 도움말 메뉴로 이동했는지 여부를 컨테이너에 알리는 플래그를 지웁니다. 그런 다음 컨테이너는 WM_MENUSELECT 컨테이너가 추가하지 않은 도움말 메뉴의 항목에 들어오거나 나가는 것을 감시합니다. 항목에서 사용자가 개체 메뉴로 이동했음을 의미하므로 컨테이너는 "개체 도움말 메뉴" 플래그를 설정하고 해당 플래그의 상태를 사용하여 WM_MENUSELECT, WM_INITMENUPOPUP 및 WM_COMMAND 메시지를 최소한 개체 창으로 전달합니다. (종료할 때 컨테이너는 플래그를 지워서 동일한 메시지 자체를 처리합니다.) 컨테이너는 개체의 함수에서 반환된 창을 이러한 메시지의 IOleInPlaceActiveObejct::GetWindow
대상으로 사용해야 합니다.
개체가 OLEMENUGROUPWIDTHS의 여섯 번째 요소에서 0을 검색하면 일반 OLE 문서 규칙에 따라 진행됩니다. 이 절차에서는 도움말 메뉴 병합에 참여하는 컨테이너와 그렇지 않은 컨테이너에 대해 설명합니다.
개체가 호출IOleInPlaceFrame::SetMenu
할 때 병합된 메뉴 모음을 표시하기 전에 컨테이너는 컨테이너가 삽입한 항목 외에도 도움말 메뉴에 추가 하위 메뉴가 있는지 여부를 검사. 이 경우 컨테이너는 병합된 메뉴 모음에 도움말 메뉴를 남깁니다. 도움말 메뉴에 추가 하위 메뉴가 없는 경우 컨테이너는 병합된 메뉴 모음에서 도움말 메뉴를 제거합니다. 이 절차에서는 도움말 메뉴 병합에 참여하는 개체와 그렇지 않은 개체를 다룹니다.
마지막으로 메뉴를 디스어셈블할 때 개체는 삽입된 도움말 메뉴를 제거하고 삽입된 다른 메뉴를 제거합니다. 컨테이너가 해당 메뉴를 제거하면 삽입한 다른 메뉴 외에도 도움말 메뉴가 제거됩니다.