新手请教各位老师:
VS2012+WIN10下的视频播放器,基于MFC+DirectShow的VC++。
我在一个名为IDC_VIDEOWND的Picture Control的控件上播放avi视频文件。
当视频暂停后,我希望将鼠标移动视频窗口,左键按下,出现一个十字线,跟随鼠标移动到我的目标位置后,左键弹起来,得到鼠标(目标位置)的坐标(客户区)。
现在的问题是:左键按下后,原来的视频画面被背景为黑色的十字线画面给覆盖了。折磨两天了,我该怎么办?C币不多,请多见谅!
大致过程如下:
在OnMouseMove事件中获取鼠标位置m_pointLine,OnTimer中调用画线的函数
void CPlayerDlg::OnTimer(UINT_PTR nIDEvent)
{
......
if(nIDEvent == CrossTimer){
DrawMouseCrossLine(m_pointLine);
}
CDialog::OnTimer(nIDEvent);
}
画线函数
void CPlayerDlg::DrawMouseCrossLine(CPoint m_point)
{
//确定绘图的区域
CWnd* pWnd = GetDlgItem(IDC_VIDEOWND);
CRect wndRect;
::GetClientRect(pWnd->GetSafeHwnd(),&wndRect);
CDC * pDC = m_VideoWindowPlay.GetDC();
CDC dcMem; //定义一个依附pDC的兼容内存DC
CBitmap bmp; //内存中再创建一个承载临时图象的位图
bmp.CreateCompatibleBitmap(pDC,wndRect.Width(), wndRect.Height());//创建兼容位图
dcMem.CreateCompatibleDC(pDC);
CBitmap *pOldBitmapImage = dcMem.SelectObject(&bmp);
//在内存DC内画图
CPoint dPoint;
CPen pen;
CPoint VpointStart, VpointEnd,HpointStart, HpointEnd;
if(m_point.x == 0 && m_point.y == 0)
{ //正中十字
VpointStart.SetPoint(wndRect.right/2 , 0);
VpointEnd.SetPoint(wndRect.right/2 , wndRect.bottom);
HpointStart.SetPoint(0,wndRect.bottom/2);
HpointEnd.SetPoint(wndRect.right,wndRect.bottom/2);
pen.CreatePen(PS_SOLID , 1, RGB(255, 0, 0)); //red
}else{
VpointStart.SetPoint(m_pointLine.x, wndRect.top);
VpointEnd.SetPoint(m_pointLine.x, wndRect.bottom);
HpointStart.SetPoint(wndRect.left , m_pointLine.y);
HpointEnd.SetPoint(wndRect.right , m_pointLine.y);
pen.CreatePen(PS_SOLID , 1, RGB(0, 0, 255)); //blue
}
dcMem.SelectObject(&pen);
dcMem.MoveTo(VpointStart);
dcMem.LineTo(VpointEnd);
dcMem.MoveTo(HpointStart);
dcMem.LineTo(HpointEnd);
//将内存DC上的图象拷贝到前台:屏幕DC?
pDC->BitBlt(0,0,wndRect.Width(),wndRect.Height(), &dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBitmapImage);
//清理
pen.DeleteObject();
dcMem.DeleteDC(); //删除DC
bmp.DeleteObject(); //删除位图
ReleaseDC(pDC);
}
DirectShow和GDI两者不兼容,为了视频加速,DirectShow是直接往屏幕上画图的,忽略了GDI的内容。
你得用DirectShow的方法去绘图,而不是GDI