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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用三极管设计一个单管共射放大电路
  • ¥20 fluent无法启动
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架