Поделиться через


Структура примера настольного приложения

Пример классического приложения состоит из двух основных частей:

  • Проект wmdapp содержит большинство классов, которые отображают пользовательский интерфейс, обрабатывают перетаскивание и сброс элементов, а также выполняют все необходимые функциональные возможности программы.
  • Проект proghelp — это вспомогательное приложение, содержащее невенсиальные классы для обработки уведомлений о состоянии и передачи файлов вручную из рабочего стола в приложение.

Исполняемый файл использует вспомогательный проект только тогда, когда пользователь выбирает использование интерфейса операций в меню "Параметры" для обработки передачи файлов вручную на устройство и чтобы увеличить полосу состояния в форме с прогрессом скачивания. Все остальные приложения обрабатываются в проекте wmdapp.

Класс Файл Описание
wmdmapp.cpp Класс, обрабатывающий родительское окно пользовательского интерфейса. Код в этом файле также обрабатывает некоторые входные данные пользователя, которые не обрабатываются CDevFiles, например создание списка воспроизведения или альбома на устройстве, удаление файлов и регистрация вариантов меню.
CDevices Devices.cpp Класс, обрабатывающий левую панель главного окна приложения, где перечислены доступные устройства. Этот класс управляет циклом обмена сообщениями, который обрабатывает входные данные пользователя, например выбор устройства и уведомление области CDevFiles для загрузки соответствующих файлов при изменении выбора устройства.
CDevFiles Devfiles.cpp Класс, обрабатывающий правую область главного окна приложения, где перечислены файлы на выбранном устройстве. Этот класс управляет циклом обмена сообщениями и обрабатывает входные данные пользователя, такие как перетаскивание файлов на устройство и удаление файлов с устройства.
CStatus Status.cpp Класс, обрабатывающий нижнюю строку состояния в главном окне, где указано количество устройств и файлов, а также объем свободной и используемой памяти на выбранном устройстве.
CWMDM Wmdevmgr.cpp Интерфейс верхнего уровня для диспетчера устройств Windows Media. Этот класс обрабатывает проверку подлинности, получает интерфейс IWMDeviceManager и регистрируется для уведомлений с помощью интерфейса IWMDMNotification.
CProgress Progress.cpp Класс в основном проекте приложения, который создает и управляет диалоговым окном, показывающим прогресс события.
CItemData ItemData.cpp Класс-оболочка, содержащий указатель либо на хранилище (если он представляет файл или папку на устройстве), либо на устройство (если он представляет само устройство), а также различные сведения об объекте, включая размер и атрибуты.
CNotificationHandler Notificationhandler.cpp Обрабатывает уведомления о прибытии и удалении устройства, оповещав окно CDevices.
CProgressHelper ProgressHelper.cpp Создано CDevFiles в локальных функциях для получения уведомлений от диспетчера устройств Windows Media путем реализации IWMDMProgress. Он используется классом CProgress для определения количества полос в индикаторе выполнения и завершения действия. Этот класс определяется как COM-объект, предоставляющий интерфейс SDK IWMDMProgress и пользовательский интерфейс IWMDMProgressHelper.
COperationHelper Operationhelper.cpp Этот класс реализует IWMDMOperation для ручной передачи файлов. Он многопоточен, чтобы обеспечить асинхронное выполнение, и определяется как COM-объект, который предоставляет пользовательский интерфейс IWMDMOperationHelper, для создания экземпляра и инициализации класса. Этот класс используется только в том случае, если пользователь выбирает "Использовать интерфейс операции" в меню Options.

 

В следующих списках описаны основные шаги, которые выполняются для различных действий пользователей.

При запуске

При запуске примера приложения выполняются следующие основные действия.

  1. Глобальная переменная CWMDM создается и проходит проверку подлинности, а также регистрируется для получения уведомлений.
  2. Создается экземпляр глобального CDevices, и вызывается CDevices::Create для создания и заполнения панели устройств.
  3. Глобальный экземпляр CDevFiles создается, и вызывается CDevFiles::Create для создания области файлов (которая не заполняется, пока пользователь не выберет устройство).
  4. Создается глобальный экземпляр CStatus, и вызывается CStatus::Create для создания строки состояния.
  5. _OnViewRefresh перечисляет все устройства и инициализирует и добавляет все устройства (CItemData) в CDevices и обновляет строку состояния, чтобы отобразить количество устройств.
  6. CDevices::AddItem добавляет элемент в представление дерева, представляющее устройства, с указателем на себя как TVITEM.lparam. Все объекты CDevice (устройства) и CDevFiles (файлы) хранятся в этом элементе узла дерева в соответствующем окне.

При выборе устройства

Следующие основные действия выполняются, когда пользователь выбирает устройство в левой области окна приложения.

  1. Окно CDevices перехватывает щелчок и отправляет сообщение WM_DRM_UPDATEDEVICE самому себе.
  2. CDevices получает собственное сообщение и вызывает UpdateSelection, который сообщает глобальному объекту CDevFiles очистить все, перечислить все элементы верхнего уровня на устройстве и вызывает CDevFiles::AddItem для добавления каждого из них в панель файлов.
  3. Наконец, CDevices вызывает CDevFiles::UpdateStatusBar для обновления строки состояния с правильными сведениями об устройстве и файле.

Создание списка воспроизведения

После нажатия кнопки "Создать список воспроизведения" в меню контейнеров приложение вызывает локальную функцию _OnCreatePlaylist, которая выполняет следующие действия:

  1. Получите количество выбранных элементов из глобальной переменной CDevFiles.
  2. Вызовите локальную функцию DlgNamePlaylist, чтобы открыть диалоговое окно, чтобы получить имя списка воспроизведения.
  3. Вызовите CProgress::Create, чтобы создать диалоговое окно, показывающее ход выполнения действия, и задайте параметры в классе CProgress, например текст заголовка, диапазон, текущее значение и т. д.
  4. Прокрутите все выбранные элементы в объекте представления дерева CDevFiles и запросите объект CItemData, связанный с каждым выбранным файлом в представлении дерева, добавив строку диалогового окна хода выполнения с каждым файлом. Файлы добавляются в массив интерфейсов IWMDMStorage.
  5. Получите дескриптор выбранного элемента и запросите его к интерфейсу IWMDMStorageControl3, который будет использоваться позже для создания нового списка воспроизведения на устройстве.
  6. Запросите выбранный объект для IWMDMStorage3и вызовите CreateEmptyMetadataObject, чтобы создать новый интерфейс IWMDMMetaData.
  7. Добавьте код формата WMDM_FORMATCODE_ABSTRACTAUDIOVIDEOPLAYLIST в новый интерфейс IWMDMMetadata и создайте список воспроизведения на устройстве, вызвав метод IWMDMStorageControl3::Insert3, передавая интерфейс метаданных. Метод получает указатель на новый IWMDMStorage на устройстве.
  8. Заполните список воспроизведения, запросив новое хранилище для IWMDMStorage4и вызвав IWMDMStorage4::SetReferences, передав массив IWMDMStorage указателей, собранных на шаге 4.
  9. Наконец, создайте новый объект CItemData для хранения нового списка воспроизведения на устройстве, инициализируйте его новым хранилищем и вызовите CDevFiles::AddItem, чтобы добавить его в область CDevFiles.

пример настольного приложения