Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пример классического приложения состоит из двух основных частей:
- Проект 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. |
В следующих списках описаны основные шаги, которые выполняются для различных действий пользователей.
При запуске
При запуске примера приложения выполняются следующие основные действия.
- Глобальная переменная CWMDM создается и проходит проверку подлинности, а также регистрируется для получения уведомлений.
- Создается экземпляр глобального CDevices, и вызывается CDevices::Create для создания и заполнения панели устройств.
- Глобальный экземпляр CDevFiles создается, и вызывается CDevFiles::Create для создания области файлов (которая не заполняется, пока пользователь не выберет устройство).
- Создается глобальный экземпляр CStatus, и вызывается CStatus::Create для создания строки состояния.
- _OnViewRefresh перечисляет все устройства и инициализирует и добавляет все устройства (CItemData) в CDevices и обновляет строку состояния, чтобы отобразить количество устройств.
- CDevices::AddItem добавляет элемент в представление дерева, представляющее устройства, с указателем на себя как TVITEM.lparam. Все объекты CDevice (устройства) и CDevFiles (файлы) хранятся в этом элементе узла дерева в соответствующем окне.
При выборе устройства
Следующие основные действия выполняются, когда пользователь выбирает устройство в левой области окна приложения.
- Окно CDevices перехватывает щелчок и отправляет сообщение WM_DRM_UPDATEDEVICE самому себе.
- CDevices получает собственное сообщение и вызывает UpdateSelection, который сообщает глобальному объекту CDevFiles очистить все, перечислить все элементы верхнего уровня на устройстве и вызывает CDevFiles::AddItem для добавления каждого из них в панель файлов.
- Наконец, CDevices вызывает CDevFiles::UpdateStatusBar для обновления строки состояния с правильными сведениями об устройстве и файле.
Создание списка воспроизведения
После нажатия кнопки "Создать список воспроизведения" в меню контейнеров приложение вызывает локальную функцию _OnCreatePlaylist, которая выполняет следующие действия:
- Получите количество выбранных элементов из глобальной переменной CDevFiles.
- Вызовите локальную функцию DlgNamePlaylist, чтобы открыть диалоговое окно, чтобы получить имя списка воспроизведения.
- Вызовите CProgress::Create, чтобы создать диалоговое окно, показывающее ход выполнения действия, и задайте параметры в классе CProgress, например текст заголовка, диапазон, текущее значение и т. д.
- Прокрутите все выбранные элементы в объекте представления дерева CDevFiles и запросите объект CItemData, связанный с каждым выбранным файлом в представлении дерева, добавив строку диалогового окна хода выполнения с каждым файлом. Файлы добавляются в массив интерфейсов IWMDMStorage.
- Получите дескриптор выбранного элемента и запросите его к интерфейсу IWMDMStorageControl3, который будет использоваться позже для создания нового списка воспроизведения на устройстве.
- Запросите выбранный объект для IWMDMStorage3и вызовите CreateEmptyMetadataObject, чтобы создать новый интерфейс IWMDMMetaData.
- Добавьте код формата WMDM_FORMATCODE_ABSTRACTAUDIOVIDEOPLAYLIST в новый интерфейс IWMDMMetadata и создайте список воспроизведения на устройстве, вызвав метод IWMDMStorageControl3::Insert3, передавая интерфейс метаданных. Метод получает указатель на новый IWMDMStorage на устройстве.
- Заполните список воспроизведения, запросив новое хранилище для IWMDMStorage4и вызвав IWMDMStorage4::SetReferences, передав массив IWMDMStorage указателей, собранных на шаге 4.
- Наконец, создайте новый объект CItemData для хранения нового списка воспроизведения на устройстве, инициализируйте его новым хранилищем и вызовите CDevFiles::AddItem, чтобы добавить его в область CDevFiles.
Связанные разделы