Реализация представления папок

Оболочка Windows предоставляет реализацию представления папок по умолчанию, которая в разговоре называется DefView, что позволяет избежать большей части работы по реализации собственного расширения пространства имен. Поскольку некоторые функции представления не могут быть реализованы с помощью пользовательских представлений, часто рекомендуется использовать объект представления системной папки по умолчанию вместо пользовательского представления. Дополнительные сведения см. в разделе SHCreateShellFolderView. В оставшейся части этого раздела рассматривается реализация пользовательского представления папок, которое не поддерживает новые функции представления.

В отличие от представления в виде дерева, Обозреватель Windows не управляет содержимым представления папок. Вместо этого в окне представления папки размещается дочернее окно, предоставляемое объектом folder. Объект folder отвечает за создание объекта представления папки для отображения содержимого папки в дочернем окне.

Ключом к реализации объекта представления папки является интерфейс IShellView . Этот интерфейс используется windows Обозреватель для взаимодействия с объектом представления папок. Перед отображением представления папки Windows Обозреватель вызывает метод IShellFolder::CreateViewObject объекта папки с riid, для IID_IShellView. Создайте объект представления папки и верните его интерфейс IShellView . Затем объект представления папки должен создать дочернее окно окна представления папки и использовать дочернее окно для отображения сведений о содержимом папки.

Помимо управления отображением данных, расширения могут настраивать ряд функций Windows Обозреватель. Например, расширение может добавлять элементы на панель инструментов или в строку меню, а также отображать сведения в строке состояния.

Объект представления папки

Объект представления папок — это com-объект, предоставляющий интерфейс IShellView . Этот объект отвечает за:

  • Создание дочернего окна окна представления папки и его использование для отображения содержимого папки.
  • Обработка взаимодействия с Windows Обозреватель.
  • Добавление команд для конкретных папок в строку меню и панель инструментов Windows Обозреватель и обработку этих команд при их выборе.
  • Управление взаимодействием пользователя с окном представления папки, например отображение контекстных меню или обработка операций перетаскивания.

В этом документе рассматриваются первые три темы. Так как взаимодействие пользователя с представлением папки происходит в дочернем окне, объект представления папки отвечает за его обработку так же, как и для любого другого окна.

Windows Обозреватель запрашивает объект представления папки, вызывая IShellFolder::CreateViewObject объекта папки с riid, для IID_IShellView. Процедура создания представления папок:

  1. Объект папки создает новый экземпляр объекта представления папок и возвращает указатель на его интерфейс IShellView .
  2. Windows Обозреватель инициализирует объект представления папки, вызывая метод IShellView::CreateViewWindow. Создайте дочернее окно окна представления папки и верните его дескриптор в windows Обозреватель.
  3. Объект представления папки использует интерфейс Windows Обозреватель IShellBrowser для настройки панели инструментов Windows Обозреватель, строки меню и строки состояния.
  4. Объект представления папки отображает содержимое папки в дочернем окне.
  5. Объект представления папки обрабатывает взаимодействие пользователя с представлением папок и любыми элементами панели инструментов или строк меню для конкретной папки.

Инициализация объекта представления папки

Windows Обозреватель инициализирует объект представления папки, вызывая метод IShellView::CreateViewWindow. Параметры метода предоставляют объекту представления папки сведения, необходимые для создания дочернего окна, которое будет использоваться для отображения содержимого папки:

  • Указатель на интерфейс IShellView предыдущего объекта представления папки. Для этого параметра можно задать значение NULL.
  • Структура FOLDERSETTINGS , содержащая параметры предыдущего представления папок.
  • Указатель на интерфейс Windows Обозреватель IShellBrowser.
  • Структура RECT с измерениями окна представления папки.

Метод IShellView::CreateViewWindow вызывается перед уничтожением предыдущего объекта представления папки. Таким образом, указатель интерфейса IShellView позволяет взаимодействовать с предыдущим объектом представления папки. Этот интерфейс в первую очередь полезен, если предыдущая папка принадлежала вашему расширению и использовала ту же схему отображения. В этом случае можно взаимодействовать с предыдущим объектом представления папки для таких целей, как обмен частными параметрами.

Простой способ определить, принадлежит ли указатель IShellView вашему расширению, заключается в том, чтобы все объекты представления папок предоставляли закрытый интерфейс. Вызовите IShellView::QueryInterface , чтобы запросить закрытый интерфейс, и проверьте возвращаемое значение, чтобы определить, является ли объект представления папки одним из ваших. Затем можно использовать закрытый метод в этом интерфейсе для обмена информацией.

Структура FOLDERSETTINGS содержит параметры отображения предыдущего представления папок. Основным параметром является режим просмотра: большой значок, маленький значок, список или сведения. Существует также флаг, содержащий параметры различных параметров отображения, например, нужно ли выровнять представление по левому краю. Отображение папки должно по возможности соответствовать этим параметрам, чтобы обеспечить согласованное взаимодействие пользователей при переходе из одной папки в другую. Следует сохранить эту структуру и обновить ее по мере изменения параметров. Windows Обозреватель вызывает IShellView::GetCurrentInfo, чтобы получить последнее значение этой структуры, прежде чем открыть следующее представление папки.

Интерфейс IShellBrowser предоставляется windows Обозреватель. Этот интерфейс является компаньоном для IShellView и позволяет объекту представления папки взаимодействовать с Windows Обозреватель. Нет другого способа получить этот указатель интерфейса, поэтому объект представления папки должен хранить его для последующего использования. В частности, необходимо вызвать IShellBrowser::GetWindow , чтобы получить окно представления родительской папки, которое будет использоваться для создания дочернего окна. Обратите внимание, что метод IShellBrowser::GetWindow не включен в документацию по IShellBrowser , так как он наследуется от IOleWindow. После сохранения указателя интерфейса не забудьте вызвать IShellBrowser::AddRef , чтобы увеличить число ссылок интерфейса. Если интерфейс больше не нужен, вызовите IShellBrowser::Release.

Чтобы создать дочернее окно, выполните следующее:

  1. Изучите структуры FOLDERSETTINGS и RECT .
  2. При необходимости получите закрытые параметры из предыдущего объекта представления папки.
  3. Вызовите метод IShellBrowser::GetWindow , чтобы получить окно представления родительской папки.
  4. Создайте дочерний элемент окна представления папки, полученного на предыдущем шаге, и верните его в Windows Обозреватель.

Отображение представления папки

После создания дочернего окна и его возврата в Windows Обозреватель можно отобразить содержимое папки. Как правило, расширения отображают свои сведения, если в дочернем окне размещается элемент управления представлением списка или элементом управления WebBrowser. Элемент управления "Представление списка" позволяет реплицировать классическое представление Windows Обозреватель. Элемент управления WebBrowser позволяет использовать динамический HTML-документ (DHTML) для отображения сведений, как в веб-представлении Windows Обозреватель. Дополнительные сведения см. в документации по этим элементам управления.

Окно представления папки всегда существует, даже если оно не имеет фокуса. Поэтому для дочернего окна следует поддерживать три состояния:

  • Активируется с фокусом. Представление папки создано и имеет фокус. Задайте пункты строки меню или панели инструментов, подходящие для состояния фокуса.
  • Активируется без фокуса. Представление папки создано и активно, но не имеет фокуса. Задайте пункты строки меню или панели инструментов, подходящие для состояния без фокусировки. Опустите все элементы, которые применяются к выбору элементов в представлении папок.
  • Отключить. Представление папки будет уничтожено. Удалите все пункты меню, относящиеся к папке.

Windows Обозреватель уведомляет объект представления папки при изменении состояния окна путем вызова IShellView::UIActivate. В свою очередь, объект представления папок должен уведомлять Windows Обозреватель, когда пользователь активирует окно представления папки, вызвав метод IShellBrowser::OnViewWindowActive. Дополнительные сведения об этом интерфейсе см. в статье Использование IShellBrowser для взаимодействия с Windows Обозреватель.

Пока представление папки активно, необходимо обработать все сообщения Windows, например WM_SIZE, принадлежащие дочернему окну. Процедура окна также будет получать сообщения WM_COMMAND для всех элементов, добавленных в строку меню или панель инструментов Windows Обозреватель.

После создания представления папки Windows Обозреватель вызывает интерфейс IShellView объекта представления папок, чтобы передать ему различные сведения. Объект должен соответствующим образом изменить его отображение. Когда представление папки будет уничтожено, Windows Обозреватель уведомляет объект представления папки, вызывая его метод IShellView::D etiesViewWindow.

Реализация IShellView

После создания объекта папки Windows Обозреватель вызывает различные методы IShellView для запроса сведений или уведомления объекта об изменении состояния Windows Обозреватель. В этом разделе описывается, как реализовать эти методы IShellView . Остальные методы используются для более специализированных целей, таких как общее диалоговое окно "Открытие файла". Дополнительные сведения см. в документации по IShellView .

AddPropertySheetPages

Когда пользователь выбирает параметры папки в меню Windows Обозреватель Tools, отображается страница свойств, позволяющая пользователю изменять параметры папки. Windows Обозреватель вызывает метод IShellView::AddPropertySheetPages объекта представления папок, чтобы вы могли добавить страницу в эту страницу свойств.

Windows Обозреватель передает указатель на функцию обратного вызова AddPropSheetPageProc в параметре lpfnобъекта IShellView::AddPropertySheetPages. Вызовите CreatePropertySheetPage , чтобы создать страницу, а затем вызовите Метод AddPropSheetPageProc, чтобы добавить его на страницу свойств. Дополнительные сведения об обработке листов свойств см. в разделе Листы свойств.

GetCurrentInfo

Когда пользователь переключается из одной папки в другую, Windows Обозреватель пытается сохранить аналогичное представление папки. Например, если в предыдущем представлении папки были показаны большие значки, то в следующем представлении также должны быть показаны большие значки. Когда Windows Обозреватель вызывает IShellView::CreateViewWindow для инициализации объекта представления папки, метод получает структуру FOLDERSETTINGS. Эта структура содержит сведения, позволяющие обеспечить согласованность представления папок с предыдущим представлением папок.

Чтобы обеспечить соответствие следующего представления текущему представлению, сохраните структуру FOLDERSETTINGS . Если представление меняется, например с больших значков на маленькие, обновите структуру соответствующим образом. Перед переключением представлений windows Обозреватель вызовет IShellView::GetCurrentInfo, чтобы запросить текущие значения FOLDERSETTINGS, чтобы передать их следующему объекту представления папки.

Обновить

Пользователь может убедиться, что представление папки отражает текущее состояние папки, выбрав Обновить в меню Вид или нажав клавишу F5. Когда пользователь делает это, Windows Обозреватель вызывает метод IShellView::Refresh. Объект представления папки должен немедленно обновить представление папки.

Saveviewstate

Windows Обозреватель вызывает метод IShellView::SaveViewState, чтобы заставить объект представления папки сохранить состояние представления. Затем можно восстановить состояние при следующем просмотре папки. Предпочтительным способом сохранения состояния представления является вызов метода IShellBrowser::GetViewStateStream . Этот метод возвращает интерфейс IStream , который объект представления папок может использовать для сохранения своего состояния. При создании другого представления папки можно вызвать тот же метод IShellBrowser::GetViewStateStream , чтобы получить указатель IStream, который позволяет считывать параметры, сохраненные предыдущими представлениями папок.

TranslateAcelerator

Когда пользователь нажимает сочетание клавиш, Windows Обозреватель передает сообщение объекту представления папок, вызвав IShellView::TranslateAccelerator. Верните S_FALSE, чтобы Windows Обозреватель обработала сообщение. Если объект представления папки обработал сообщение, верните S_OK.

Если окно представления папки имеет фокус, Windows Обозреватель вызывает IShellView::TranslateAccelerator перед обработкой сообщения. Так как большинство сообщений обычно связаны с командами windows Обозреватель строке меню или панели инструментов, объект представления папки обычно должен возвращать S_FALSE. Windows Обозреватель может обработать сообщение обычным образом. Возвращайте S_OK только в том случае, если сообщение зависит от папки и вы не хотите, чтобы windows Обозреватель делали дальнейшую обработку. Если представление папки не имеет фокуса, Windows Обозреватель сначала обрабатывает сообщение. Он вызывает IShellBrowser::TranslateAcceleratorSB , только если не обрабатывает сообщение.

Использование IShellBrowser для взаимодействия с Windows Обозреватель

Интерфейс IShellBrowser используется объектом представления папок для взаимодействия с Windows Обозреватель для различных целей, в том числе:

Изменение строки меню Обозреватель Windows

В строке меню Обозреватель Windows пользователь может запускать различные команды. По умолчанию строка меню поддерживает только команды, относящиеся к Windows Обозреватель. Связанные WM_COMMAND сообщения обрабатываются windows Обозреватель и не передаются в объект представления папок. Однако вы можете изменить строку меню, чтобы включить один или несколько пунктов меню для конкретной папки с помощью IShellBrowser. Windows Обозреватель передает связанные сообщения WM_COMMAND этих элементов в процедуру окна объекта папки для обработки. Вы также можете удалить или отключить все стандартные команды, которые не применяются к приложению.

Объекты представления папок обычно изменяют строку меню перед отображением представления папки. Они должны вернуть строку меню в исходное состояние при уничтожении представления папки. Вам также может потребоваться изменять строку меню каждый раз, когда представление папки получает или теряет фокус.

Так как Windows Обозреватель вызывает IShellView::UIActivate при каждом изменении состояния окна представления папок, изменение строки меню обычно включается в реализацию этого метода. Основная процедура изменения строки меню Обозреватель Windows:

  1. Вызовите CreateMenu , чтобы создать дескриптор меню.
  2. Передайте этот дескриптор меню в Windows Обозреватель путем вызова IShellBrowser::InsertMenusSB. Windows Обозреватель заполнит сведения о своем меню.
  3. При необходимости измените меню.
  4. Вызовите IShellBrowser::SetMenuSB, чтобы Windows Обозреватель отображала измененную строку меню.

Windows Обозреватель имеет шесть всплывающих меню в строке меню. Как и все контейнеры OLE, меню windows Обозреватель разделено на шесть групп: Файл, Изменить, Контейнер, Объект, Окно и Справка. В следующей таблице перечислены всплывающие меню Обозреватель Windows и связанные с ними группы, а также идентификаторы меню.

Всплывающее меню ID Группа
File FCIDM_MENU_FILE File
Изменить FCIDM_MENU_EDIT File
Представление FCIDM_MENU_VIEW Контейнер
Избранное FCIDM_MENU_FAVORITES Контейнер
Инструменты FCIDM_MENU_TOOLS Контейнер
Справка FCIDM_MENU_HELP Окно

 

При передаче дескриптора меню в Windows Обозреватель путем вызова IShellBrowser::InsertMenusSB необходимо также передать указатель на структуру OLEMENUGROUPWIDTHS, элементы которой инициализированы нулевым значением.

При возврате IShellBrowser::InsertMenusSB Обозреватель Windows добавит свои пункты меню. Затем вы можете использовать возвращенный дескриптор меню со стандартными функциями меню Windows, такими как InsertMenuItem , для:

  • Добавьте элементы во всплывающие меню Windows Обозреватель.
  • Изменение или удаление существующих элементов во всплывающих меню Windows Обозреватель.
  • Добавление новых всплывающих меню.

Используйте идентификаторы, перечисленные в таблице, для определения различных всплывающих меню windows Обозреватель.

Примечание

Чтобы избежать конфликтов с идентификаторами команд Windows Обозреватель, идентификаторы всех добавляемых пунктов меню должны находиться между FCIDM_SHVIEWFIRST и FCIDM_SHVIEWLAST. Эти два значения определены в файле Shlobj.h.

 

Завершив изменение меню, вызовите метод IShellBrowser::SetMenuSB, чтобы windows Обозреватель отобразить новую строку меню.

После первоначального отображения представления папки Windows Обозреватель вызывает IShellView::UIActivate каждый раз, когда представление папки получает или теряет фокус. Если у вас есть пункты меню, которые чувствительны к состоянию представления папок, следует изменять меню соответствующим образом при каждом изменении состояния. Например, у вас может быть пункт меню, который работает с элементом в представлении папок, выбранным пользователем. Этот пункт меню следует отключить или удалить, когда представление папки теряет фокус.

Когда Windows Обозреватель вызывает IShellView::UIActivate, чтобы указать, что представление папки деактивировано, восстановите строку меню в исходное состояние, вызвав метод IShellBrowser::RemoveMenusSB.

Изменение панели инструментов windows Обозреватель

Помимо изменения строки меню windows Обозреватель, на панель инструментов также можно добавить кнопки. Как и в строке меню, изменение панели инструментов обычно является частью реализации IShellView::UIActivate . Процедура добавления кнопок на панель инструментов Windows Обозреватель:

  1. Добавьте растровое изображение кнопки в список изображений панели инструментов.
  2. Определите текстовую строку кнопки.
  3. Добавьте кнопку на панель инструментов.

Чтобы добавить растровое изображение в список изображений панели инструментов, отправьте на панели инструментов TB_ADDBITMAP сообщение, вызвав метод IShellBrowser::SendControlMsg. Чтобы указать элемент управления панели инструментов, задайте для параметра id метода значение FCW_TOOLBAR. Задайте для wParam число изображений кнопок в растровом изображении, а для lParam — адрес структуры TBADDBITMAP . Индекс изображения возвращается в параметре pret .

Существует два способа определения строки для кнопки:

Чтобы добавить кнопку на панель инструментов, заполните структуру TBBUTTON и передайте ее в IShellBrowser::SetToolbarItems. Как и в меню, идентификатор команды должен находиться между FCIDM_SHVIEWFIRST и FCIDM_SHVIEWLAST. Затем панель инструментов добавит кнопку справа от существующих кнопок.

Например, следующий фрагмент кода добавляет одну стандартную кнопку на панель инструментов Windows Обозреватель с идентификатором команды IDB_MYBUTTON.

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

Вы можете использовать строку состояния Обозреватель Windows для отображения различных полезных сведений. Существует два способа использования строки состояния:

  • Используйте IShellBrowser::SetStatusTextSB для отображения текстовой строки в строке состояния.
  • Отправляйте сообщения непосредственно в элемент управления "Строка состояния" с помощью IShellBrowser::SendControlMsg.

Первый метод прост, но достаточно для многих целей. Для большей гибкости можно отправлять сообщения непосредственно в элемент управления "Строка состояния", вызвав метод IShellBrowser::SendControlMsg с параметром id , равным FCW_STATUS. Дополнительные сведения об элементах управления строкой состояния см. в разделе Столбцы состояния.

Хранение сведений, относящихся к представлению

Когда представление будет уничтожено, часто полезно хранить такие сведения, как состояние представления или его параметры. Windows Обозреватель предлагает выполнить эту задачу, вызвав IShellView::SaveViewState. Предпочтительным способом сохранения сведений, относящихся к представлению, является вызов IShellBrowser::GetViewStateStream. Этот метод предоставляет интерфейс IStream , который можно использовать для хранения информации. Вы можете использовать любой подходящий формат данных.