Статьи / Программирование / Windows 7 Libraries и API / Библиотека Windows 7 Libraries .NET Sample Library (ч.4)
Библиотека Windows 7 Libraries .NET Sample Library (ч.4)Просмотров: 1662
20.05.2009 14:06
 
Настало время обратиться к сущности библиотек Windows 7. Это четвертая статья в цикле статей о библиотеках Windows 7. Мы уже обсудили, что такое библиотеки Windows 7, рассмотрели их внутреннюю структуру, а также то, как они интегрируются в оболочку Windows. А сегодня мы рассмотрим различные варианты, с помощью которых программисты могут связать работу библиотек Windows 7 со своими приложениями.

Библиотеки являются, по своей сути, воротами для пользовательских данных в Windows 7. Они являются составной частью оболочки системы и используются в Windows повсюду — в Windows Explorer, Меню Start, стандартном диалоговом окне работы с файлами. Пользователи 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 у программиста есть инструментарий пространства имён .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.
Источник: www.thevista.ru