편집

다음을 통해 공유


Internet Explorer 스타일 메뉴 모음을 만드는 방법

언뜻 보기에 Microsoft Internet Explorer 5 이상 메뉴 모음은 표준 메뉴와 유사합니다. 그러나 사용을 시작할 때는 매우 다르게 보입니다.

다음 스크린샷은 도구 메뉴가 선택된 Windows Internet Explorer 메뉴 모음을 보여 줍니다.

도구 메뉴가 선택된 Windows Internet Explorer 메뉴 모음을 보여 주는 스크린샷

메뉴 모음은 실제로 표준 메뉴처럼 보이는 도구 모음 컨트롤입니다. 최상위 메뉴 항목 대신 메뉴 모음에는 클릭할 때 드롭다운 메뉴를 표시하는 일련의 텍스트 전용 단추가 있습니다. 그러나 특수한 유형의 도구 모음인 메뉴 모음에는 표준 메뉴에 없는 몇 가지 기능이 있습니다.

  • 이는 표준 도구 모음 기술을 사용하여 사용자 지정할 수 있으므로 사용자가 항목을 이동, 삭제 또는 추가할 수 있습니다.
  • 사용자가 먼저 클릭하지 않고도 최상위 항목 위에 있을 때 알 수 있으므로 핫 트래킹을 사용할 수 있습니다.

메뉴 모음을 rebar 컨트롤에 통합하여 다음과 같은 기능을 제공할 수 있습니다.

  • 사용자가 밴드를 이동하거나 크기를 조정할 수 있는 그리퍼가 포함될 수 있습니다.
  • 이전 그림의 표준 도구 모음과 같은 다른 밴드와 rebar 컨트롤의 스트립을 공유할 수 있습니다.
  • 인접 밴드로 덮여 있을 때 펼침 단추를 표시하여 사용자에게 숨겨진 항목에 대한 액세스 권한을 부여할 수 있습니다.
  • 애플리케이션에서 정의한 백그라운드 비트맵이 포함될 수 있습니다.

이 항목에서는 메뉴 모음을 구현하는 방법에 대해 설명합니다. 메뉴 모음은 도구 모음 컨트롤의 특수한 구현이므로 메뉴 모음과 관련된 항목에 초점을 맞춥니다. 도구 모음을 rebar 컨트롤에 통합하는 방법에 대한 자세한 내용은 Internet Explorer 스타일 도구 모음을 만드는 방법Rebar 컨트롤 정보를 참조하세요.

메뉴 모음에 도구 모음 만들기

메뉴 모음에 도구 모음을 만들려면 다음을 수행합니다.

  • 다른 창 스타일 플래그와 함께 TBSTYLE_FLAT을 포함하여 플랫 도구 모음을 만듭니다. TBSTYLE_FLAT 스타일을 사용하면 핫 트래킹도 가능합니다. 이 스타일을 사용하면 사용자가 단추를 활성화할 때까지 메뉴 모음이 표준 메뉴처럼 보입니다. 그러면 단추가 표준 단추처럼 도구 모음에 표시되고 클릭하여 누를 수 있습니다. 핫 트래킹을 사용하도록 설정했기 때문에 단추를 활성화하려면 커서를 마우스로 가리키기만 하면 됩니다. 커서가 다른 단추로 이동하면 활성화되고 이전 단추가 비활성화됩니다.
  • 다른 창 스타일 플래그와 함께 TBSTYLE_LIST를 포함하여 목록 스타일 단추를 만듭니다. 이 스타일은 표준 최상위 메뉴 항목처럼 보이는 더 얇은 단추를 만듭니다.
  • 단추의 TBBUTTON 구조체의 iBitmap 멤버를 I_IMAGENONE에 설정하고 iString 멤버를 단추 텍스트로 설정하여 단추 텍스트 전용으로 만듭니다.
  • 각 단추에 BTNS_DROPDOWN 스타일을 지정합니다. 단추를 클릭하면 도구 모음 컨트롤은 애플리케이션에 TBN_DROPDOWN 알림을 보내 단추의 메뉴를 표시하라는 메시지를 표시합니다.
  • 메뉴 모음을 rebar 밴드에 통합합니다. Internet Explorer 스타일 도구 모음을 만드는 방법에 설명된 대로 그리퍼와 펼침 단추를 모두 사용하도록 설정합니다.
  • TBN_DROPDOWN 처리기를 구현하여 클릭할 때 단추의 드롭다운 메뉴를 표시합니다. 드롭다운 메뉴는 팝업 메뉴의 유형입니다. TrackPopupMenu 함수를 사용하여 만들어지며 왼쪽 위 모서리가 단추의 왼쪽 아래 모서리에 맞춰집니다.
  • 마우스 없이 메뉴 모음에 완전히 액세스할 수 있도록 키보드 탐색을 구현합니다.
  • 메뉴 핫 트래킹을 구현합니다. 표준 메뉴의 경우 최상위 메뉴 항목의 메뉴가 표시된 후 커서를 다른 최상위 항목 위로 이동하면 메뉴가 자동으로 표시되고 이전 항목의 메뉴가 축소됩니다. 도구 모음 컨트롤은 커서를 핫 트랙하고 단추 이미지를 변경하지만 새 메뉴가 자동으로 표시됩니다. 애플리케이션은 명시적으로 이를 수행해야 합니다.

이러한 항목의 대부분은 구현이 쉬우며 다른 부분에서 설명합니다. 도구 모음 및 rebar 컨트롤을 사용하는 방법에 대한 일반적인 설명은 Internet Explorer 스타일 도구 모음을 만드는 방법, 도구 모음 컨트롤 정보 또는 Rebar 컨트롤 정보를 참조하세요. 팝업 메뉴를 처리하는 방법에 대한 자세한 내용은 메뉴를 참조하세요. 키보드 탐색 및 메뉴 핫 트래킹의 마지막 두 항목은 이 항목의 나머지 부분에서 설명합니다.

메뉴 핫 트래킹을 사용하지 않도록 설정하여 탐색 처리

사용자는 마우스, 키보드 또는 둘 다 혼합하여 메뉴 모음을 탐색하도록 선택할 수 있습니다. 메뉴 모음 탐색을 구현하려면 애플리케이션이 도구 모음 알림을 처리하고 마우스 및 키보드를 모니터링해야 합니다. 이 작업은 메뉴 핫 트래킹을 사용 및 사용하지 않는 두 개의 고유한 부분으로 나눌 수 있습니다. 이 섹션에서는 메뉴가 표시되지 않고 메뉴 핫 트래킹이 활성화되지 않은 경우 탐색을 처리하는 방법을 설명합니다.

마우스 탐색

메뉴 핫 트래킹을 사용하지 않도록 설정하면 메뉴 모음을 일반 도구 모음으로 처리할 수 있습니다. 사용자가 마우스로 탐색하는 경우 애플리케이션에서는 TBN_DROPDOWN 알림을 처리하기만 하면 됩니다. 이 알림이 수신되면 적절한 드롭다운 메뉴를 표시하고 메뉴 핫 트래킹을 사용하도록 설정합니다. 그때부터 메뉴 핫 트래킹을 사용하도록 설정하여 탐색 처리에 설명된 메뉴 핫 트래킹 체제에 있게 됩니다.

혼합 탐색에서 설명한 대로 활성 단추를 추적하려면 TBN_HOTITEMCHANGE 알림을 처리해야 합니다. 사용자가 마우스로만 탐색하는 경우 이 알림은 관련이 없지만 마우스 및 키보드 탐색이 혼합된 경우에는 필요합니다.

키보드 탐색

이전 섹션에서 설명한 대로 사용자는 메뉴 핫 트래킹을 사용하지 않도록 설정한 경우 키보드로 여러 탐색 작업을 수행할 수 있습니다. 도구 모음 컨트롤은 포커스가 있는 경우에만 키보드 탐색을 지원합니다. 또한 메뉴 모음에 필요한 모든 키 누름을 처리하지는 않습니다. 키보드 탐색을 처리하는 가장 간단한 솔루션은 관련 키 누름 이벤트를 명시적으로 처리하는 것입니다.

메뉴 핫 트래킹을 사용하지 않도록 설정한 경우 애플리케이션은 다음과 같은 방식으로 이러한 키 누름 이벤트를 처리해야 합니다.

  • F10 키입니다. TB_SETHOTITEM을 사용하여 첫 번째 단추를 활성화합니다.
  • 왼쪽 및 오른쪽 화살표. TB_SETHOTITEM을 사용하여 인접한 단추를 활성화합니다. 사용자가 메뉴 모음의 양쪽 끝을 탐색하려고 하면 반대쪽 끝에 있는 첫 번째 단추를 활성화합니다.
  • ESCAPE 키. TB_SETHOTITEM을 사용하여 활성 단추를 비활성화합니다. 메뉴 모음은 첫 번째 단추를 활성화하기 전 상태로 반환되어야 합니다.
  • ALT- 가속기 키. TB_MAPACCELERATOR 메시지를 사용하여 문자가 해당하는 단추를 확인합니다. 단추의 드롭다운 메뉴를 표시하고 메뉴 핫 트래킹을 사용하도록 설정합니다.
  • 아래쪽 화살표 키입니다. 단추가 활성 상태이지만 메뉴가 표시되지 않은 경우 단추의 메뉴를 표시하고 메뉴 핫 트래킹을 사용하도록 설정합니다.
  • <Enter> 키입니다. TB_SETHOTITEM을 사용하여 활성 단추를 비활성화합니다. 메뉴 모음은 첫 번째 단추를 활성화하기 전 상태로 반환되어야 합니다.

혼합 탐색

이전 섹션에 설명된 키보드 탐색 처리기는 기본적으로 활성 단추를 추적하고 단추를 선택할 때 적절한 메뉴를 표시하는 두 가지 작업을 수행합니다. 이러한 처리기는 사용자가 키보드로만 탐색하는 한 충분합니다. 그러나 사용자는 키보드와 마우스 탐색을 혼합하는 경우가 많습니다. 예를 들어 F10 키를 사용하여 첫 번째 단추를 활성화하고 마우스를 사용하여 다른 단추를 활성화한 다음 아래쪽 화살표 키로 메뉴를 열 수 있습니다. 활성 키를 추적하기 위해 키 누름만 모니터링하는 경우 잘못된 메뉴가 표시됩니다. 또한 활성 단추를 정확하게 추적하려면 TBN_HOTITEMCHANGE 알림을 처리해야 합니다.

메뉴 핫 트래킹을 사용하도록 설정하여 탐색 처리

메뉴 핫 트래킹을 사용하도록 설정하면 애플리케이션이 사용자 탐색에 응답하는 방식을 변경해야 합니다. 표준 메뉴의 동작을 복제하려면 다음 기능을 명시적으로 구현해야 합니다.

마우스로 탐색:

  • 사용자가 커서를 다른 단추 위로 이동하면 해당 메뉴가 즉시 나타나고 이전 메뉴가 사라집니다.
  • 메뉴 핫 트래킹은 사용자가 명령을 선택하거나 메뉴 영역에 속하지 않는 지점을 클릭할 때까지 활성 상태로 유지됩니다. 두 작업 모두 다른 단추를 클릭할 때까지 메뉴 핫 트래킹을 비활성화합니다.
  • 커서가 메뉴에서 벗어나면 현재 드롭다운 메뉴는 커서가 다시 위로 이동하거나 사용자가 메뉴로 덮인 영역의 바깥쪽 점을 클릭할 때까지 유지됩니다. 커서가 현재 표시된 단추와 다른 단추로 돌아오면 이전 메뉴가 축소되고 새 메뉴가 표시됩니다.

키보드로 탐색:

  • 오른쪽 화살표 키는 포커스를 오른쪽으로 이동합니다. 항목에 하위 메뉴가 있는 경우 하위 메뉴가 표시됩니다. 항목에 하위 메뉴가 없는 경우 메뉴 및 하위 메뉴가 축소되고 TB_SETHOTITEM을 사용하여 다음 단추를 활성화한 다음 인접 단추의 메뉴를 표시합니다. 이 메시지가 수신될 때 마지막 단추가 활성 상태이면 첫 번째 단추의 메뉴를 표시합니다.

  • 왼쪽 화살표 키는 포커스를 왼쪽으로 이동합니다. 항목이 하위 메뉴인 경우 해당 메뉴가 축소되고 포커스가 부모 메뉴로 이동합니다. 항목이 하위 메뉴가 아닌 경우 해당 메뉴가 축소되고 TB_SETHOTITEM을 사용하여 다음 단추를 활성화한 다음 해당 단추의 메뉴를 표시합니다.

  • ESCAPE 키는 디스플레이를 한 단계 백업합니다.

    • 하위 메뉴가 표시되면 축소되고 포커스가 부모 메뉴로 이동합니다.
    • 단추의 메뉴가 표시되면 축소되고 메뉴 핫 트래킹이 비활성화됩니다. 항목의 단추가 활성 상태로 유지됩니다.
    • 메뉴가 표시되지 않지만 단추가 활성 상태이면 단추가 비활성화되고 메뉴 핫 트래킹이 비활성화됩니다.
  • 위쪽 화살표 및 아래쪽 화살표 키는 특정 메뉴 내에서 탐색하는 데만 사용됩니다.

  • ENTER 키는 메뉴 항목과 연결된 명령을 시작합니다. 메뉴 항목에 하위 메뉴가 있는 경우 ENTER 키에 이 메뉴가 표시됩니다.

메뉴 핫 트래킹 사용 안 함 사례와 마찬가지로 애플리케이션은 마우스, 키보드 및 혼합 탐색을 처리할 수 있어야 합니다. 그러나 메뉴가 표시된다는 사실은 메시징을 다소 다르게 처리해야 한다는 것을 의미합니다.

메뉴 핫 트래킹에 대한 메시지 처리

메뉴 핫 트래킹을 사용하려면 새 메뉴로 전환하는 데 필요한 짧은 간격을 제외하고 항상 메뉴를 표시해야 합니다. 그러나 TrackPopupMenu에 의해 표시되는 드롭다운 메뉴는 모달입니다. 애플리케이션은 WM_COMMAND, TBN_HOTITEMCHANGEWM_MENUSELECT와 같은 일반 메뉴 관련 메시지를 포함하여 일부 메시지를 계속 직접 수신합니다. 그러나 하위 수준 키보드 또는 마우스 메시지를 직접 수신하지는 않습니다. WM_MOUSEMOVE와 같은 메시지를 처리하려면 메뉴로 전달되는 메시지를 가로채도록 메시지 후크를 설정해야 합니다.

드롭다운 메뉴가 표시되면 idHook 매개 변수가 WH_MSGFILTER로 설정된 SetWindowsHookEx 함수를 호출하여 메시지 후크를 설정합니다. 메뉴에 대한 모든 메시지는 MessageProc에 전달됩니다. 예를 들어 다음 코드 조각은 드롭다운 메뉴로 가는 메시지를 트래핑하는 메시지 후크를 설정합니다. MsgHook는 후크 프로시저의 이름이고 hhookMsg는 프로시저에 대한 핸들입니다.

hhookMsg = SetWindowsHookEx(WH_MSGFILTER, MsgHook, HINST_THISDLL, 0);

메뉴 메시지는 후크 프로시저의 nCode 매개 변수를 MSGF_MENU로 설정하여 식별됩니다. lParam 매개 변수는 메시지와 함께 MSG 구조체를 가리킵니다. 처리해야 하는 메시지와 방법에 대한 세부 정보는 이 항목의 나머지 부분에서 설명합니다.

애플리케이션은 CallNextHookEx 함수를 호출하여 모든 메시지를 다음 메시지 후크에 전달해야 합니다. 또한 마우스 메시지를 도구 모음 컨트롤로 직접 보내야 하며, 모든 점 좌표를 도구 모음 클라이언트 좌표 공간으로 변환해야 합니다. 메시지를 직접 보내면 도구 모음 컨트롤이 적절한 마우스 메시지를 받습니다. 예를 들어 도구 모음은 해당 단추를 핫 트랙하기 위해 WM_MOUSEMOVE 메시지를 수신해야 합니다.

새 단추가 활성화되면 애플리케이션이 WM_CANCELMODE 메시지와 함께 이전 드롭다운 메뉴를 축소하고 새 메뉴를 표시해야 합니다. 또한 키보드 탐색이 있는 메뉴 모음에서 포커스를 이동하거나 메뉴 영역 바깥쪽을 클릭하여 드롭다운 메뉴를 축소해야 합니다. 메뉴를 축소할 때마다 UnhookWindowsHookEx 함수를 사용하여 메시지 후크를 해제해야 합니다. 다른 드롭다운 메뉴를 표시해야 하는 경우 새 메시지 후크를 만듭니다. 명령이 시작되면 메뉴가 자동으로 축소되지만 메시지 후크를 명시적으로 해제해야 합니다.

다음 코드 예제에서는 이전 예제에서 설정한 메시지 후크를 해제합니다.

UnhookWindowsHookEx(hhookMsg);

마우스 탐색

일반 도구 모음 컨트롤 핫 트랙 단추는 활성 단추를 강조 표시하고 새 단추가 활성화될 때마다 애플리케이션에 TBN_HOTITEMCHANGE 알림을 보냅니다. 애플리케이션은 적절한 드롭다운 메뉴를 표시해야 합니다. 다음이 필요합니다.

  • TBN_HOTITEMCHANGE 알림을 처리하여 활성 단추를 추적합니다. 활성 단추가 변경되면 이전 메뉴를 축소하고 새 메뉴를 만듭니다.
  • 단추를 클릭할 때 전송되는 TBN_DROPDOWN 알림을 처리합니다. 그런 다음 메뉴를 축소하고 메뉴 핫 트래킹을 사용하지 않도록 설정해야 합니다. 단추는 활성 상태로 유지합니다.
  • 메시지 후크 프로시저에서 WM_LBUTTONDOWN, WM_RBUTTONDOWNWM_MOUSEMOVE 메시지를 처리하여 마우스 위치를 추적합니다. 메뉴 영역 외부에서 마우스를 클릭하면 현재 드롭다운 메뉴를 축소하고 메뉴 핫 트래킹을 비활성화한 다음 메뉴 모음을 사전 활성화 상태로 되돌립니다.
  • 메뉴 명령이 시작되면 메뉴 핫 트래킹을 사용하지 않도록 설정합니다. 메뉴는 자동으로 축소되지만 메시지 후크를 명시적으로 해제해야 합니다.

메뉴 항목이 하위 메뉴를 표시해야 할 때 전송되는 WM_INITMENUPOPUP 메시지와 같은 메뉴 관련 메시지도 처리해야 합니다. 이러한 메시지를 처리하는 방법에 대한 자세한 내용은 메뉴를 참조하세요.

키보드 탐색

애플리케이션은 메시지 후크 프로시저에서 키보드 메시지를 처리하고 메뉴 핫 트래킹에 영향을 미치는 메시지를 처리해야 합니다. 다음 키 누름을 처리해야 합니다.

  • ESCAPE 키. ESCAPE 키는 디스플레이를 한 수준 위로 백업합니다. 하위 메뉴가 표시되면 축소해야 합니다. 단추의 기본 메뉴가 표시되면 축소하고 메뉴 핫 트래킹을 사용하지 않도록 설정합니다. 단추는 활성 상태로 유지합니다.
  • 오른쪽 화살표 키입니다. 항목에 하위 메뉴가 있는 경우 표시합니다. 항목에 하위 메뉴가 없는 경우 메뉴 및 하위 메뉴를 축소하고 TB_SETHOTITEM을 사용하여 다음 단추를 활성화한 다음 해당 메뉴를 표시합니다. 이 알림이 수신되었을 때 마지막 단추가 활성화된 경우 첫 번째 단추의 메뉴를 표시합니다.
  • 왼쪽 화살표 키입니다. 항목이 하위 메뉴에 있는 경우 항목을 축소하고 포커스를 부모 메뉴로 이동합니다. 항목이 하위 메뉴가 아닌 경우 메뉴를 축소하고 , TB_SETHOTITEM을 사용하여 인접 단추를 활성화한 다음 해당 메뉴를 표시합니다. 이 알림을 받을 때 첫 번째 단추가 활성화된 경우 마지막 단추의 메뉴를 표시합니다.
  • 위쪽 및 아래쪽 화살표 키. 이러한 키는 메뉴 내에서 탐색하는 데 사용되지만 메뉴 핫 트래킹에는 직접적인 영향을 미치지 않습니다.
  • ALT- 가속기 키. TB_MAPACCELERATOR 메시지를 사용하여 문자가 해당하는 단추를 확인합니다. 현재 활성 단추와 다른 단추에 해당하는 경우 현재 드롭다운 메뉴를 축소하고 TB_SETHOTITEM을 사용하여 새 단추를 활성화한 다음 인접 단추의 메뉴를 표시합니다. 키 문자가 현재 표시된 단추에 해당하는 경우 드롭다운 메뉴를 축소하고 메뉴 핫 트래킹을 사용하지 않도록 설정합니다. 단추는 활성 상태로 유지되어야 합니다.