Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Заметка
Устаревший фильтр отрисовщика видео всегда использует режим окна. Фильтры VMR-7 и VMR-9 используют режим окна по умолчанию, но также поддерживают режим без окон.
В оконном режиме отрисовщик видео создает собственное окно, в котором он отрисовывает видеокадры. Если вы не указали другое, это окно верхнего уровня с собственными границами и строкой заголовка. Однако большую часть времени вы прикрепите окно видео к окну приложения, чтобы видео было интегрировано в пользовательский интерфейс приложения. Для этого необходимо выполнить следующие действия.
- Запрос IVideoWindow.
- Задайте родительское окно.
- Задайте новые стили окон.
- Размещение окна видео внутри окна владельца.
- Уведомите окно видео о сообщениях WM_MOVE.
запрос для IVideoWindow
Перед началом воспроизведения выполните запрос к диспетчеру графов фильтров для интерфейса IVideoWindow:
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&pVidWin);
Установить родительское окно
Чтобы задать родительское окно, вызовите метод IVideoWindow::put_Owner с дескриптором окна приложения. Этот метод принимает переменную типа OAHWND, так что приведите дескриптор к этому типу:
pVidWin->put_Owner((OAHWND)hwnd);
Установить новые стили окон
Измените стиль окна видео, вызвав метод IVideoWindow::put_WindowStyle:
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
Флаг WS_CHILD устанавливает окно как дочернее, а флаг WS_CLIPSIBLINGS предотвращает прорисовку окна внутри клиентской области другого дочернего окна.
положение окна видео
Чтобы задать позицию видео относительно клиентской области окна приложения, вызовите метод IVideoWindow::SetWindowPosition. Этот метод принимает прямоугольник, указывающий левый край, верхний край, ширину и высоту окна видео. Например, следующий код растягивает окно видео, чтобы соответствовать всей клиентской области родительского окна:
RECT rc;
GetClientRect(hwnd, &rc);
pVidWin->SetWindowPosition(0, 0, rc.right, rc.bottom);
Чтобы получить собственный размер видео, вызовите метод IBasicVideo::GetVideoSize в диспетчере графов фильтров. Эти сведения можно использовать для масштабирования видео и поддержания правильного пропорционирования.
Обработка сообщений WM_MOVE
Для обеспечения оптимальной производительности следует уведомлять отрисовщик видео всякий раз, когда окно перемещается во время приостановки графа. Вызовите метод IVideoWindow::NotifyOwnerMessage для пересылки сообщения WM_MOVE:
// (Inside your WindowProc)
case WM_MOVE:
pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam);
break;
Если отрисовщик использует аппаратное наложение, это уведомление заставляет отрисовщик обновить положение наложения. (VmR-9 не использует наложения, поэтому не нужно вызывать этот метод, если вы используете VMR-9.)
очистка
Перед завершением работы приложения остановите граф и сбросьте владельца окна видео, чтобы NULL. В противном случае сообщения окна могут быть отправлены в неправильное окно, что, скорее всего, приведет к ошибкам. Кроме того, если не скрыть окно видео, вы можете увидеть, как изображение видео на мгновение мерцает на экране.
pControl->Stop();
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);
Заметка
Если родительский элемент окна видео является дочерним элементом основного окна приложения (иными словами, если окно видео является дочерним), необходимо создать видео окно с помощью CoCreateInstance и добавить его в граф, а не разрешить диспетчеру фильтров добавить отрисовщик видео во время Intelligent Connect. Это гарантирует, что окно видео и дочернее окно перерисовываются одновременно. В противном случае дочернее окно может закрасить окно видео.
Связанные разделы