体育佬
2020-08-07 21:38
采纳率: 100%
浏览 154

在视频画面上画十字线随鼠标移动,但原画面被覆盖了?

新手请教各位老师:
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);

}

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • threenewbee 2020-08-08 10:18
    已采纳

    DirectShow和GDI两者不兼容,为了视频加速,DirectShow是直接往屏幕上画图的,忽略了GDI的内容。
    你得用DirectShow的方法去绘图,而不是GDI

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题