Как правильно добавить кнопки на видеоэкран Media Foundation Interfaces - PullRequest
0 голосов
/ 03 мая 2018

Я сейчас пытаюсь собрать плеер буквально с нуля, используя Media Foundation Interfaces.

Я использую пример, взятый отсюда: https://msdn.microsoft.com/en-us/library/windows/desktop/dd979592(v=vs.85).aspx

В качестве основы для игрока.

Я хочу добавить кнопки (кнопка «назад / вперед», индикатор выполнения и т. Д.) В окно экрана видео, но мне не очень понятно, как.

Я не могу просто добавить кнопку в качестве дочернего элемента главного окна, поскольку она скрыта плеером, я пытался добавить кнопки в качестве дочерних элементов окна Видео, но это не сработало ...

Как правильно добавить кнопки в видеоокно?

Это часть кода, где вы регистрируетесь в окне проигрывателя (для полного кода, пожалуйста, введите ссылку, которую я прикрепил).

// create the instance of the player hwnd = handle of main window
HRESULT hr = CPlayer::CreateInstance(hwnd, hwnd, &g_pPlayer);

// inner call to cplayer
CPlayer *pPlayer = new (std::nothrow) CPlayer(hVideo, hEvent);

// Create a partial topology. (m_hwndVideo == hVideo == hwnd)
hr = CreatePlaybackTopology(m_pSource, pSourcePD, m_hwndVideo, &pTopology);

я пытаюсь использовать эту функцию, чтобы изменить видео краску, чтобы у меня были некоторые поместите слева внизу, чтобы поставить мои кнопки, вот моя функция:

VOID update_lower_window(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);

    RECT rc;
    GetClientRect(hwnd, &rc);

    //rc = father size
    RECT repaint;
    memcpy(&repaint, &rc, sizeof(RECT));
    repaint.top = repaint.bottom - DOWN_SPACE; // DOWN_SPACE == 50

    // paint back bottom to white
    FillRect(hdc, &repaint, (HBRUSH)COLOR_WINDOW);

    EndPaint(hwnd, &ps);
}

я вызываю эту функцию, когда:

  1. WM_PAINT случилось
  2. WM_SIZE случилось
  3. WM_CREATE случилось

С этими словами я все еще не смог достичь своих целей:

  1. Когда фильм начинает воспроизводиться, он запускается в полноэкранном режиме и не оставляет свободного места, которое я хотел (кажется, я не могу найти сообщение, отправленное во время воспроизведения фильма, или другими словами, когда фильм рисует на экране, он не отправлен одно из сообщений, в которое я вставил свою функцию)
  2. Когда я уменьшаю экран, остатки предыдущего экрана все еще остаются внизу, и я не вижу фон.
  3. При использовании кнопки «Свернуть» возникает то же явление, что и в 2.

Еще одна интересная деталь Явление, которое я упомянул в 2, возникает только тогда, когда я изменяю размер окна путем перетаскивания снизу вверх, если я изменяю размер окна путем перетаскивания из одного угла (увеличивает или уменьшает высоту и ширину одновременно), то окно исправляет себя и я вижу в нижней белой части (фон) все время.

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете изменить область видео, чтобы ваш win32 GUI (кнопки и прогресс) был ниже. Посмотрите обработчик WM_SIZE в этом примере, чтобы узнать, как это сделать, они вычисляют прямоугольник, чтобы занять окно, и вы можете настроить его, чтобы приспособить ваши элементы управления.

Если вам нужны полупрозрачные накладные элементы управления, вы можете написать EVR Presenter. https://msdn.microsoft.com/en-us/library/windows/desktop/bb530107(v=vs.85).aspx https://github.com/Microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/multimedia/mediafoundation/evrpresenter

Но это относительно сложно.

P.S. Если вы просто хотите простое решение, используйте что-то более высокого уровня. Как и элемент управления проигрывателя Windows Media , обратите внимание, что в них есть пример C ++ или .NET для GUI и MediaElement.

Обновление: Я думаю, что правильное место для установки начальной позиции видео в этом примере, скорее всего, CPlayer :: OnTopologyStatus, после строки MFGetService (MR_VIDEO_RENDER_SERVICE).

В любом случае, другой подход, который может быть проще для вашей задачи, создать дочернее окно, выделенное для видео. Расположите его так, чтобы он занимал большую часть главного окна вашего приложения и оставлял только нижние 50 пикселей незанятыми. Не забудьте обработать как минимум WM_SIZE для изменения положения, а в идеале также WM_DISPLAYCHANGED, WM_ENDSESSION, WM_GETMINMAXINFO. Настройте воспроизведение MF так, чтобы видео занимало полное дочернее видеоокно. Это гарантирует, что видео не будет мешать Win32-материалам, которые вы рисуете на нижней панели размером 50 пикселей.

Кстати, именно этим и занимается MPC-HC, см. Рис. enter image description here Как вы видите на скриншоте Spy ++, у них есть выделенное окно видео, а также другие дочерние окна для элементов управления проигрывателя Win32.

...