Настало время обратиться к сущности библиотек Windows 7. Они являются составной частью оболочки системы и используются в Windows повсюду – в Windows Explorer, Меню Start, стандартном диалоговом окне работы с файлами. В этом материале мы рассмотрим различные варианты, с помощью которых программисты могут связать работу библиотек Windows 7 со своими приложениями.
Библиотеки являются, по своей сути, воротами для пользовательских данных в Windows 7. Пользователи Windows 7 будут так или иначе применять библиотеки в своей повседневной работе. Поэтому все они ожидают, что программы, работающие в Windows 7, будут правильно взаимодействовать с библиотеками и смогут обеспечить тот же уровень удобства и прозрачности, что и Windows Explorer. Именно поэтому так важно, чтобы мы, программисты, знали, как правильно работать с библиотеками и встраивать их поддержку в свои приложения.
Прежде, чем я перейду к сути, хочу отметить, что хотя большинство программ должны по умолчанию корректно работать с библиотеками Windows 7, существует возможность встроить поддержку библиотек в программу, чтобы обеспечить наилучшие результаты работы для пользователей.
Встроенная поддержка библиотек Windows 7 в приложениях
Кто-то может спросить, а что случится, если моя программа не поддерживает библиотеки? Представим себе, что частью функциональности программы является сохранение файла на диске. Программа запрашивает у пользователя, в каком месте следует сохранить файл. Пользователь выбирает библиотеку документов как свою излюбленную папку для сохранения, поскольку именно так он поступает всегда, когда хочет сохранить документ, с которым собирается работать дальше. Но если программа не понимает, что выбранная пользователем библиотека документов – вовсе не обычная папка, она будет безуспешно пытаться сохранить данные именно в библиотеке как в папке. В этом и заключается проблема, поскольку, как нам уже известно, библиотеки не являются элементами файловой системы, поэтому к ним нельзя обращаться, как к обычным папкам с файлами.
Правильно подготовленное к работе с библиотеками приложение должно включать механизмы, позволяющие управлять ситуациями, когда пользователь по недосмотру либо выбирает библиотеку как папку для сохранения, либо загружает содержимое библиотеки. Более того, многие программы разрешают пользователям взаимодействовать напрямую с файловой системой – это их неотъемлемое свойство. Программа обязана обеспечить пользователю те же самые условия сохранения данных, которые знакомы им по стандартному пользовательскому интерфейсу Windows 7, предлагающему организовывать контент именно используя библиотеки. Включая папку в библиотеку, пользователи определяют, где именно будут храниться важные для них данные, и поэтому программы обязаны считаться с намерениями пользователей, обеспечивая возможность взаимодействия с библиотеками.
У разработчиков есть три способа интеграции библиотек Windows 7 в свою программу. Вам следует внимательно ознакомиться с ними и выбрать подходящий.
1. Основной метод интеграции заключается в использовании нового стандартного диалогового окна для работы с файлом (Common File Dialog, далее CFD), через которое осуществляется выбор файла или папки для загрузки или сохранения.
2. Второй метод позволяет программам по-новому «засверкать» в Windows 7, позволив им работать с библиотеками и их содержимым.
3. Последний и наиболее передовой способ – всё время поддерживать синхронизацию с содержимым библиотеки и напрямую манипулировать ими, используя IShellLibrary API, позволяющий полностью контролировать их, вплоть до создания новых библиотек.
Давайте начнём с самого первого варианта, который следует рассматривать также как необходимый минимум требований к приложению, чтобы его можно было считать совместимым с библиотеками Windows 7.
Использование стандартного диалогового окна для работы с файлом
Хорошая новость заключается в том, что благодаря САВ пользователи могут просматривать библиотеки, выполнять поиск по их содержимому и даже выбирать библиотеку в качестве места хранения своих данных – не папку в библиотеке, а собственно библиотеку!
Но (всегда есть какое-нибудь «но») мы настоятельно рекомендуем пользоваться новым интерфейсом CFD, представленными ещё в Windows Vista, а не устаревшими или модифицированными его версиями. Очень важно понимать, что API для использования устаревшего CFD не менялись со времён Windows Vista и ХР для обеспечения совместимости. Старая версия CFD (как видно на рисунке ниже) не поддерживает библиотеки напрямую и не обеспечивает преимуществ, предлагаемых в Windows 7.
Но даже если библиотеки видны в правой части окна навигации, требуется дополнительный щелчок кнопкой мыши для сохранения в одной из подпапок, а не в самой библиотеке. Также CFD старого образца не предоставляет возможностей поиска и сортировки, доступных в библиотеках. Наконец, старая версия не поддерживает выделение одновременно нескольких объектов в различных папках, предоставляемое библиотеками в рамках базовой функциональности.
Таким образом, важно выбрать правильные API для вывода корректной версии CFD. При использовании .NET у программиста есть инструментарий пространства имён System.Windows.Forms.FileDialog или Microsoft.Win32.FileDialog. Последний использует устаревший вариант CFD. Именно поэтому следует пользоваться пространством имен WinForms для вывода нового CFD. Ниже вы видите фрагмент кода, который обеспечивает выбор пользователем места хранения файла, выводя CFD, как это показано далее на рисунке.
System.Windows.Forms.SaveFileDialog _fd =
new System.Windows.Forms.SaveFileDialog();
_fd.Title = "Please choose a location to save your file";
_fd.FileName = "[Get Folder…]";
_fd.Filter = "Library|no.files";
if (_fd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
string dir_path = System.IO.Path.GetDirectoryName(_fd.FileName);
if (dir_path != null && dir_path.Length > 0)
{
//this returns the path to the default save location
lblResult.Content = dir_path;
}
}
Разработчики неуправляемого кода, должны пользоваться новым семейством «естественных» API для IFileDialog (IFileDialog, IFileOpenDialog, IFileSaveDialog, IFileDialogCustomize, IFileDialogEvents, IFileDialogControlEvents), которые пришли на смену устаревшим API GetOpenFileName и GetSaveFileName из предыдущих версий Windows.
Неуправляемые API оболочки основаны на COM, поэтому прежде, чем использовать какой-либо СОМ-объект, следует непременно инициализировать его путём вызова CoCreateInstance. Например, следующий фрагмент кода обеспечивает выбор пользователем библиотеки или папки внутри неё в качестве места хранения файла, выводя соответствующий CFD.
*ppsi = NULL;
IFileSaveDialog *pfod;
hr = CoCreateInstance(
CLSID_FileSaveDialog,
NULL,
CLSCTX_INPROC,
IID_PPV_ARGS(&pfod));
if (SUCCEEDED(hr))
{
hr = pfod->SetOptions(FOS_PICKFOLDERS);
if (SUCCEEDED(hr))
{
hr = pfod->Show(hWndParent);
if (SUCCEEDED(hr))
{
hr = pfod->GetResult(ppsi);
}
}
pfod->Release();
}
После инициализации переменной *pfod IFileSaveDialog опции диалога устанавливаются на выбор папки передачей флага FOS_PICKFOLDERS в процедуру IFileOpenDialog.SetOptions(). Этот код сообщает диалогу «Открыть», что пользователю нужно предоставить выбор папок вместо файлов и разрешить выбор библиотеки. При выборе библиотеки, CFD возвратит основную папку для сохранения по умолчанию, асоциированную с выбранной библиотекой.
Эти два фрагмента кода весьма просты и не являются чем-то принципиально новым. Тем не менее, важно обеспечить стабильность и постоянство реализации поддержки библиотек Windows 7 в приложениях, работающих в новой операционной системе.
В следующей статье мы продемонстрируем работу нового API библиотек Windows 7, а также способы использования содержимого библиотек с помощью существующих API оболочки Windows.