폴더 보기 구현

Windows Shell은 자체 네임스페이스 확장을 구현하는 많은 작업을 방지할 수 있도록 구어체로 DefView라고 하는 폴더 뷰의 기본 구현을 제공합니다. 일부 보기 기능은 사용자 지정 보기를 통해 수행할 수 없으므로 사용자 지정 보기 대신 기본 시스템 폴더 뷰 개체를 사용하는 것이 좋습니다. 자세한 내용은 SHCreateShellFolderView를 참조하세요. 이 항목의 나머지 부분에서는 최신 보기 기능을 지원할 수 없는 사용자 지정 폴더 보기 구현에 대해 설명합니다.

트리 뷰와 달리 Windows Explorer 폴더 보기의 내용을 관리하지 않습니다. 대신 폴더 보기 창에는 폴더 개체에서 제공하는 자식 창이 호스트됩니다. 폴더 개체는 폴더 뷰 개체를 만들어 자식 창에 폴더의 내용을 표시합니다.

폴더 뷰 개체를 구현하는 데 필요한 키는 IShellView 인터페이스입니다. 이 인터페이스는 Windows Explorer 폴더 뷰 개체와 통신하는 데 사용됩니다. 폴더 보기를 표시하기 전에 Windows Explorer riid가 IID_IShellView 설정된 폴더 개체의 IShellFolder::CreateViewObject 메서드를 호출합니다. 폴더 뷰 개체를 만들고 해당 IShellView 인터페이스를 반환합니다. 그런 다음 폴더 뷰 개체는 폴더 보기 창의 자식 창을 만들고 자식 창을 사용하여 폴더 내용에 대한 정보를 표시해야 합니다.

확장은 데이터가 표시되는 방식을 제어하는 것 외에도 Windows Explorer 다양한 기능을 사용자 지정할 수 있습니다. instance 경우 확장은 도구 모음 또는 메뉴 모음에 항목을 추가하거나 상태 표시줄에 정보를 표시할 수 있습니다.

폴더 뷰 개체

폴더 뷰 개체는 IShellView 인터페이스를 노출하는 COM(구성 요소 개체 모델) 개체입니다. 이 개체는 다음을 담당합니다.

  • 폴더 보기 창의 자식 창을 만들고 이를 사용하여 폴더의 내용을 표시합니다.
  • Windows Explorer 통신 처리.
  • Windows Explorer 메뉴 모음 및 도구 모음에 폴더별 명령을 추가하고 해당 명령을 선택할 때 처리합니다.
  • 바로 가기 메뉴 표시 또는 끌어서 놓기 작업 처리와 같은 폴더 보기 창과의 사용자 상호 작용 관리

이 문서에서는 처음 세 가지 topics 설명합니다. 폴더 보기와의 사용자 상호 작용은 자식 창 내에서 이루어지므로 폴더 뷰 개체는 다른 창과 마찬가지로 처리해야 합니다.

Windows Explorer riid가 IID_IShellView 설정된 폴더 개체의 IShellFolder::CreateViewObject를 호출하여 폴더 뷰 개체를 요청합니다. 폴더 보기를 만드는 절차는 다음과 같습니다.

  1. 폴더 개체는 폴더 뷰 개체의 새 instance 만들고 해당 IShellView 인터페이스에 대한 포인터를 반환합니다.
  2. Windows Explorer IShellView::CreateViewWindow 메서드를 호출하여 폴더 뷰 개체를 초기화합니다. 폴더 보기 창의 자식 창을 만들고 해당 핸들을 Windows Explorer 반환합니다.
  3. 폴더 뷰 개체는 Windows Explorer IShellBrowser 인터페이스를 사용하여 Windows Explorer 도구 모음, 메뉴 모음 및 상태 막대를 사용자 지정합니다.
  4. 폴더 뷰 개체는 자식 창에 폴더의 내용을 표시합니다.
  5. 폴더 뷰 개체는 폴더 보기 및 폴더별 도구 모음 또는 메뉴 모음 항목과의 사용자 상호 작용을 처리합니다.

폴더 뷰 개체 초기화

Windows Explorer IShellView::CreateViewWindow 메서드를 호출하여 폴더 뷰 개체를 초기화합니다. 메서드의 매개 변수는 폴더의 내용을 표시하는 데 사용할 자식 창을 만드는 데 필요한 정보를 폴더 뷰 개체에 제공합니다.

이전 폴더 뷰 개체가 제거되기 전에 IShellView::CreateViewWindow 메서드가 호출됩니다. 따라서 IShellView 인터페이스 포인터를 사용하면 이전 폴더 뷰 개체와 통신할 수 있습니다. 이 인터페이스는 이전 폴더가 확장에 속하고 동일한 표시 체계를 사용하는 경우에 주로 유용합니다. 이 경우 프라이빗 설정을 교환하는 등의 목적으로 이전 폴더 뷰 개체와 통신할 수 있습니다.

IShellView 포인터가 확장에 속하는지 여부를 확인하는 간단한 방법은 모든 폴더 보기 개체가 프라이빗 인터페이스를 노출하도록 하는 것입니다. IShellView::QueryInterface를 호출하여 프라이빗 인터페이스를 요청하고 반환 값을 검사하여 폴더 뷰 개체가 사용자 중 하나인지 확인합니다. 그런 다음, 해당 인터페이스에서 프라이빗 메서드를 사용하여 정보를 교환할 수 있습니다.

FOLDERSETTINGS 구조에는 이전 폴더 보기의 표시 설정이 포함됩니다. 기본 설정은 보기 모드( 큰 아이콘, 작은 아이콘, 목록 또는 세부 정보)입니다. 보기 왼쪽 맞춤 여부와 같은 다양한 표시 옵션의 설정을 포함하는 플래그도 있습니다. 폴더 표시는 사용자가 한 폴더에서 다른 폴더로 이동하는 일관된 환경을 제공하기 위해 가능한 한 이러한 설정을 따라야 합니다. 이 구조를 저장하고 설정이 변경되면 업데이트해야 합니다. Windows Explorer IShellView::GetCurrentInfo를 호출하여 다음 폴더 보기를 열기 전에 이 구조체의 최신 값을 가져옵니다.

IShellBrowser 인터페이스는 Windows Explorer 의해 노출됩니다. 이 인터페이스는 IShellView와 함께 사용되며 폴더 뷰 개체가 Windows Explorer 통신할 수 있도록 합니다. 이 인터페이스 포인터를 검색하는 다른 방법은 없으므로 폴더 뷰 개체는 나중에 사용할 수 있도록 저장해야 합니다. 특히 IShellBrowser::GetWindow 를 호출하여 자식 창을 만드는 데 사용할 부모 폴더 보기 창을 검색해야 합니다. IShellBrowser::GetWindow 메서드는 IOleWindow에서 상속되므로 IShellBrowser 설명서에 포함되지 않습니다. 인터페이스 포인터를 저장한 후 IShellBrowser::AddRef 를 호출하여 인터페이스의 참조 횟수를 증분해야 합니다. 인터페이스가 더 이상 필요하지 않으면 IShellBrowser::Release를 호출합니다.

자식 창을 만들려면 다음을 수행합니다.

  1. FOLDERSETTINGSRECT 구조를 검사합니다.
  2. 필요한 경우 이전 폴더 뷰 개체에서 프라이빗 설정을 가져옵니다.
  3. IShellBrowser::GetWindow를 호출하여 부모 폴더 보기 창을 검색합니다.
  4. 이전 단계에서 가져온 폴더 보기 창의 자식 을 만들고 Windows Explorer 반환합니다.

폴더 보기 표시

자식 창을 만들어 Windows Explorer 반환한 후에는 폴더의 내용을 표시할 수 있습니다. 일반적으로 확장은 자식 창이 목록 보기 컨트롤 또는 WebBrowser 컨트롤을 호스트하도록 하여 해당 정보를 표시합니다. 목록 보기 컨트롤을 사용하면 Windows Explorer 클래식 보기를 복제할 수 있습니다. WebBrowser 컨트롤을 사용하면 Windows Explorer 웹 보기와 마찬가지로 DHTML(동적 HTML) 문서를 사용하여 정보를 표시할 수 있습니다. 자세한 내용은 해당 컨트롤의 설명서를 참조하세요.

폴더 보기 창은 포커스가 없더라도 항상 존재합니다. 따라서 자식 창에 대해 다음 세 가지 상태를 유지 관리해야 합니다.

  • 포커스를 사용하여 활성화됩니다. 폴더 뷰가 만들어졌으며 포커스가 있습니다. 포커스가 있는 상태에 적합한 메뉴 모음 또는 도구 모음 항목을 설정합니다.
  • 포커스 없이 활성화됩니다. 폴더 보기가 만들어졌으며 활성 상태이지만 포커스가 없습니다. 포커스가 없는 상태에 적합한 메뉴 모음 또는 도구 모음 항목을 설정합니다. 폴더 보기 내의 항목 선택 영역에 적용되는 항목을 생략합니다.
  • 비활성화되었습니다. 폴더 보기가 제거될 예정입니다. 모든 폴더별 메뉴 항목을 제거합니다.

Windows Explorer IShellView::UIActivate를 호출하여 창 상태가 변경되면 폴더 뷰 개체에 알립니다. 그러면 사용자가 IShellBrowser::OnViewWindowActive를 호출하여 폴더 보기 창을 활성화할 때 폴더 뷰 개체가 Windows Explorer 알려야 합니다. 이 인터페이스에 대한 자세한 내용은 IShellBrowser를 사용하여 Windows Explorer 통신을 참조하세요.

폴더 보기가 활성 상태인 동안 자식 창에 속하는 모든 Windows 메시지( 예: WM_SIZE)를 처리해야 합니다. 창 프로시저는 Windows Explorer 메뉴 모음 또는 도구 모음에 추가한 항목에 대한 WM_COMMAND 메시지를 받습니다.

폴더 보기를 만든 후 Windows Explorer 폴더 뷰 개체의 IShellView 인터페이스를 호출하여 다양한 정보를 전달합니다. 개체는 그에 따라 디스플레이를 수정해야 합니다. 폴더 보기를 제거하려고 하면 Windows Explorer IShellView::D estroyViewWindow 메서드를 호출하여 폴더 뷰 개체에 알립니다.

IShellView 구현

폴더 개체를 만든 후 Windows Explorer 다양한 IShellView 메서드를 호출하여 정보를 요청하거나 Windows Explorer 상태의 변경 내용을 개체에 알립니다. 이 섹션에서는 이러한 IShellView 메서드를 구현하는 방법을 간략하게 설명합니다. 나머지 메서드는 파일 열기 일반 대화 상자와 같은 보다 특수한 용도로 사용됩니다. 자세한 내용은 IShellView 설명서를 참조하세요.

AddPropertySheetPages

사용자가 Windows Explorer도구 메뉴에서 폴더 옵션을 선택하면 사용자가 폴더 옵션을 수정할 수 있는 속성 시트가 표시됩니다. Windows Explorer 폴더 뷰 개체의 IShellView::AddPropertySheetPages 메서드를 호출하여 이 속성 시트에 페이지를 추가할 수 있습니다.

Windows Explorer IShellView::AddPropertySheetPageslpfn 매개 변수에 있는 AddPropSheetPageProc 콜백 함수에 대한 포인터를 전달합니다. CreatePropertySheetPage를 호출하여 페이지를 만든 다음 AddPropSheetPageProc를 호출하여 속성 시트에 추가합니다. 속성 시트를 처리하는 방법에 대한 자세한 내용은 속성 시트를 참조하세요.

GetCurrentInfo

사용자가 한 폴더에서 다른 폴더로 전환하면 Windows Explorer 유사한 폴더 보기를 유지하려고 시도합니다. instance 경우 이전 폴더 보기에 큰 아이콘이 표시되면 다음 폴더도 표시되어야 합니다. Windows Explorer IShellView::CreateViewWindow를 호출하여 폴더 뷰 개체를 초기화하면 메서드는 FOLDERSETTINGS 구조를 받습니다. 이 구조에는 폴더 보기를 이전 폴더 보기와 일치하도록 만들 수 있는 정보가 포함되어 있습니다.

다음 보기가 현재 보기와 일치하도록 하려면 FOLDERSETTINGS 구조를 저장합니다. 보기가 변경되면 큰 아이콘에서 작은 아이콘으로 instance 구조체를 적절하게 업데이트합니다. 보기를 전환하기 전에 Windows Explorer IShellView::GetCurrentInfo를 호출하여 현재 FOLDERSETTINGS 값을 요청하여 다음 폴더 뷰 개체에 전달합니다.

새로 고침

사용자는 보기 메뉴에서 새로 고침 을 선택하거나 F5 키를 눌러 폴더 보기 가 폴더의 현재 상태를 반영하는지 확인할 수 있습니다. 이렇게 하면 Windows Explorer IShellView::Refresh 메서드를 호출합니다. 폴더 뷰 개체는 폴더 보기 표시를 즉시 업데이트해야 합니다.

SaveViewState

Windows Explorer IShellView::SaveViewState 메서드를 호출하여 폴더 뷰 개체에 뷰 상태를 저장하라는 메시지를 표시합니다. 그런 다음 다음에 폴더를 볼 때 상태를 복구할 수 있습니다. 보기 상태를 저장하는 기본 방법은 IShellBrowser::GetViewStateStream 메서드를 호출하는 것입니다. 이 메서드는 폴더 뷰 개체가 상태를 저장하는 데 사용할 수 있는 IStream 인터페이스를 반환합니다. 다른 폴더 보기를 만들 때 동일한 IShellBrowser::GetViewStateStream 메서드를 호출하여 이전 폴더 뷰에서 저장한 설정을 읽을 수 있는 IStream 포인터를 가져올 수 있습니다.

TranslateAcelerator

사용자가 바로 가기 키를 누르면 Windows Explorer IShellView::TranslateAccelerator를 호출하여 폴더 뷰 개체에 메시지를 전달합니다. S_FALSE 반환하여 Windows에서 메시지를 처리할 Explorer 있습니다. 폴더 뷰 개체가 메시지를 처리한 경우 S_OK 반환합니다.

폴더 보기 창에 포커스가 있는 경우 Windows Explorer 메시지를 처리하기 전에 IShellView::TranslateAccelerator를 호출합니다. 대부분의 메시지는 일반적으로 Windows Explorer 메뉴 모음 또는 도구 모음 명령과 연결되므로 폴더 뷰 개체는 일반적으로 S_FALSE 반환해야 합니다. 그러면 Windows Explorer 메시지를 정상적으로 처리할 수 있습니다. 메시지가 폴더별로 지정되고 Windows Explorer 추가 처리를 수행하지 않으려는 경우에만 S_OK 반환합니다. 폴더 보기에 포커스가 없으면 Windows Explorer 메시지를 먼저 처리합니다. 메시지를 처리하지 않는 경우에만 IShellBrowser::TranslateAcceleratorSB 를 호출합니다.

IShellBrowser를 사용하여 Windows와 통신 Explorer

IShellBrowser 인터페이스는 폴더 뷰 개체에서 다음과 같은 다양한 용도로 Windows Explorer 통신하는 데 사용됩니다.

Windows Explorer 메뉴 모음 수정

Windows Explorer 메뉴 모음을 사용하면 사용자가 다양한 명령을 시작할 수 있습니다. 기본적으로 메뉴 모음은 Windows Explorer 관련된 명령만 지원합니다. 관련 WM_COMMAND 메시지는 Windows Explorer 처리되며 폴더 뷰 개체에 전달되지 않습니다. 그러나 IShellBrowser를 사용하여 하나 이상의 폴더별 메뉴 항목을 포함하도록 메뉴 모음을 수정할 수 있습니다. Windows Explorer 해당 항목의 연결된 WM_COMMAND 메시지를 폴더 개체의 창 프로시저로 전달하여 처리합니다. 애플리케이션에 적용되지 않는 표준 명령을 제거하거나 사용하지 않도록 설정할 수도 있습니다.

폴더 뷰 개체는 일반적으로 폴더 보기가 처음 표시되기 전에 메뉴 모음을 수정합니다. 폴더 보기가 제거되면 메뉴 모음을 원래 상태로 반환해야 합니다. 폴더 보기에서 포커스를 얻거나 잃을 때마다 메뉴 모음을 수정해야 할 수도 있습니다.

Windows Explorer 폴더 보기 창의 상태가 변경 될 때마다 IShellView::UIActivate를 호출하므로 메뉴 모음 수정은 일반적으로 해당 메서드의 구현에 포함됩니다. Windows Explorer 메뉴 모음을 수정하는 기본 절차는 다음과 같습니다.

  1. CreateMenu를 호출하여 메뉴 핸들을 만듭니다.
  2. IShellBrowser::InsertMenusSB를 호출하여 해당 메뉴 핸들을 Windows Explorer 전달합니다. Windows Explorer 메뉴 정보를 채웁니다.
  3. 필요에 따라 메뉴를 수정합니다.
  4. IShellBrowser::SetMenuSB를 호출하여 Windows Explorer 수정된 메뉴 모음을 표시하도록 합니다.

Windows Explorer 메뉴 모음에 6개의 팝업 메뉴가 있습니다. 모든 OLE 컨테이너와 마찬가지로 Windows Explorer 메뉴는 파일, 편집, 컨테이너, 개체, 창 및 도움말의 6개 그룹으로 나뉩니다. 다음 표에서는 메뉴 ID와 함께 Windows Explorer 팝업 메뉴 및 관련 그룹을 나열합니다.

팝업 메뉴 ID 그룹
파일 FCIDM_MENU_FILE 파일
편집 FCIDM_MENU_EDIT 파일
보기 FCIDM_MENU_VIEW 컨테이너
즐겨찾기 FCIDM_MENU_FAVORITES 컨테이너
도구 FCIDM_MENU_TOOLS 컨테이너
도움말 FCIDM_MENU_HELP 시간 범위

 

IShellBrowser::InsertMenusSB를 호출하여 Windows Explorer 메뉴 핸들을 전달하는 경우 멤버가 0으로 초기화된 OLEMENUGROUPWIDTHS 구조체에 대한 포인터도 전달해야 합니다.

IShellBrowser::InsertMenusSB가 반환되면 Windows Explorer 메뉴 항목을 추가합니다. 그런 다음 , InsertMenuItem 과 같은 표준 Windows 메뉴 함수와 함께 반환된 메뉴 핸들을 사용하여 다음을 수행할 수 있습니다.

  • Windows Explorer 팝업 메뉴에 항목을 추가합니다.
  • Windows Explorer 팝업 메뉴에서 기존 항목을 수정하거나 삭제합니다.
  • 새 팝업 메뉴를 추가합니다.

표에 나열된 ID를 사용하여 다양한 Windows Explorer 팝업 메뉴를 식별합니다.

참고

Windows Explorer 명령 ID와의 충돌을 방지하려면 추가하는 메뉴 항목의 ID가 FCIDM_SHVIEWFIRST FCIDM_SHVIEWLAST 사이여야 합니다. 이러한 두 값은 Shlobj.h에 정의되어 있습니다.

 

메뉴 수정이 완료되면 IShellBrowser::SetMenuSB를 호출하여 Windows Explorer 새 메뉴 모음을 표시하도록 합니다.

폴더 보기가 처음 표시되면 Windows Explorer 폴더 보기가 포커스를 얻거나 잃을 때마다 IShellView::UIActivate를 호출합니다. 폴더 보기의 상태에 중요한 메뉴 항목이 있는 경우 상태가 변경 될 때마다 그에 따라 메뉴를 수정해야 합니다. instance 경우 사용자가 선택한 폴더 보기의 항목에 대해 작동하는 메뉴 항목이 있을 수 있습니다. 폴더 보기에 포커스가 끊어지면 이 메뉴 항목을 사용하지 않도록 설정하거나 제거해야 합니다.

Windows Explorer IShellView::UIActivate를 호출하여 폴더 보기가 비활성화되고 있음을 나타내는 경우 IShellBrowser::RemoveMenusSB를 호출하여 메뉴 모음을 원래 상태로 복원합니다.

Windows Explorer 도구 모음 수정

Windows Explorer 메뉴 모음을 수정하는 것 외에도 도구 모음에 단추를 추가할 수도 있습니다. 메뉴 모음과 마찬가지로 도구 모음 수정은 일반적으로 IShellView::UIActivate 구현의 일부입니다. Windows Explorer 도구 모음에 단추를 추가하는 절차는 다음과 같습니다.

  1. 도구 모음의 이미지 목록에 단추의 비트맵을 추가합니다.
  2. 단추의 텍스트 문자열을 정의합니다.
  3. 도구 모음에 단추를 추가합니다.

도구 모음의 이미지 목록에 비트맵을 추가하려면 IShellBrowser::SendControlMsg를 호출하여 도구 모음에 TB_ADDBITMAP 메시지를 보냅니다. 도구 모음 컨트롤을 지정하려면 메서드의 id 매개 변수를 FCW_TOOLBAR 설정합니다. wParam을 비트맵의 단추 이미지 수로 설정하고 lParamTBADDBITMAP 구조체의 주소로 설정합니다. 이미지 인덱스는 pret 매개 변수에 반환됩니다.

단추에 대한 문자열을 정의하는 방법에는 두 가지가 있습니다.

  • 단추의 TBBUTTON 구조체의 iString 멤버에 문자열을 할당합니다.
  • IShellBrowser::SendControlMsg를 호출하여 도구 모음 컨트롤에 TB_ADDSTRING 메시지를 보냅니다. wParam 매개 변수는 0으로 설정하고 lParam 매개 변수를 문자열로 설정해야 합니다. 문자열 인덱스는 pret 매개 변수에 반환됩니다.

도구 모음에 단추를 추가하려면 TBBUTTON 구조를 입력하고 IShellBrowser::SetToolbarItems에 전달합니다. 메뉴와 마찬가지로 명령 ID는 FCIDM_SHVIEWFIRST FCIDM_SHVIEWLAST 사이여야 합니다. 그런 다음 도구 모음은 기존 단추의 오른쪽에 단추를 추가합니다.

instance 경우 다음 코드 조각은 명령 ID가 IDB_MYBUTTON Windows Explorer 도구 모음에 하나의 표준 단추를 추가합니다.

TBADDBITMAP tbadbm;
int iButtonIndex;
TBBUTTON tbb;

tbadbm.hInst = g_hInstance;    // The module's instance handle
tbadbm.nID = IDB_BUTTONIMAGE;  // The bitmap's resource ID

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1,
                    reinterpret_cast<LPARAM>(&tbadbm), &iButtonIndex);

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDSTRING, NULL,
                    reinterpret_cast<LPARAM>(szLabel), &iStringIndex);

ZeroMemory(&tbb, sizeof(TBBUTTON));
tbb.iBitmap = iButtonIndex;
tbb.iCommand = IDB_MYBUTTON;
tbb.iString = iStringIndex;
tbb.fsState = TBSTATE_ENABLED;
tbb.fsStyle = TBSTYLE_BUTTON;

psb->SetToolbarItems(&tbb, 1, FCT_MERGE);

도구 모음 컨트롤을 처리하는 방법에 대한 자세한 내용은 도구 모음 컨트롤을 참조하세요.

Windows Explorer 상태 표시줄 수정

Windows Explorer 상태 표시줄을 사용하여 다양한 유용한 정보를 표시할 수 있습니다. 상태 막대를 사용하는 방법에는 두 가지가 있습니다.

첫 번째 메서드는 간단하지만 여러 용도로 충분합니다. 유연성을 높이기 위해 id 매개 변수가 FCW_STATUS 설정된 IShellBrowser::SendControlMsg를 호출하여 상태 막대 컨트롤로 직접 메시지를 보낼 수 있습니다. 상태 막대 컨트롤에 대한 자세한 내용은 상태 표시줄을 참조하세요.

보기별 정보 저장

뷰가 제거될 때 보기의 상태 또는 설정과 같은 정보를 저장하는 것이 유용한 경우가 많습니다. Windows Explorer IShellView::SaveViewState를 호출하여 이 작업을 수행하라는 메시지를 표시합니다. 보기 관련 정보를 저장하는 기본 방법은 IShellBrowser::GetViewStateStream을 호출하는 것입니다. 이 메서드는 정보를 저장하는 데 사용할 수 있는 IStream 인터페이스를 제공합니다. 적합한 데이터 형식을 자유롭게 사용할 수 있습니다.