【发布时间】:2018-05-05 01:34:31
【问题描述】:
我目前正在尝试使用媒体基础接口从头开始构建播放器。
我使用取自此处的示例: 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);
}
我在以下情况下调用此函数:
-
WM_PAINT碰巧 -
WM_SIZE碰巧 -
WM_CREATE碰巧
话虽如此,我仍然无法实现我的目标:
- 当电影开始播放时,它开始全屏并且没有留下我想要的空间(我似乎找不到播放电影时发送的消息,或者换句话说,当电影在屏幕上绘制时它没有发送我插入函数的消息之一)
- 当我缩小屏幕时,前一个屏幕的残余仍然保持向下,我看不到背景。
- 使用“最小化”按钮时,会出现与 2 中相同的现象。
另一个有趣的细节我在2中提到的现象仅在我通过从下往上拖动来更改窗口大小时发生,如果我通过从一个角拖动来更改窗口大小(同时放大或减小高度和宽度)然后窗口会自行纠正我一直在底部的白色部分(背景)看到。
【问题讨论】:
标签: c++ winapi ms-media-foundation