我用采集卡的SDK在VC下编写自己的图像采集程序,遇到以下问题。
1、我把采集到的图像输出到单文档框架的客户区(我不知道这样表述对不对,不好意思,希望大家能看懂),显示图像正常,但是当窗口框架被拖动时,视频图像还是在原位置,并不随程序框架移动。这是为什么?我该如何做才能让程序向一个播放器一样可以挪动呢?
2、我的程序上的菜单必须在停止采集冻结图像时点击,打开的菜单项和对对应的话框才不会被视频图像挡住。和又是为什么?怎么解决??图像处理我已经搞定了,但是关于以上两个问题好像不是算法问题。我实在弄不懂MFC的相关问题。
我不是做计算机的,是第一次用VC编程序,完全是初学。一直在看MSDN和例子。学得很费劲。
这两个问题很菜,但我查了好多资料,没找到解决办法。谢谢大家看贴!!

解决方案 »

  1.   

    1:可能移动窗体的时候,你需要重新设置播放的位置,还是要查看你的采集卡的SDK是怎么说的,总之是在窗体的WM_MOVE消息中处理.如果是MFC要重载窗体类的OnMove的函数
    2:这个像图层的问题,采集卡的SDK应该可以设置播放的层吧
      

  2.   

    我用的是大恒的DH-VT120采集卡,分析了他的单卡采集实例程序,与我自己的程序比较没看到有设么特别的地方,为什么例子就不存在我遇到的问题呢??
      

  3.   

    谢谢“WingForce”我试验一下。谢谢你这么快回复。我现在是好多MFC的基本概念都搞不清呢。
    惭愧啊!
    采集卡的SDK没有提到播放的层的问题。
      

  4.   

    采集卡的SDK应该提供了设置视频表面位置的API,一般都是GetClientRect之后设置的,不同的采集卡的Api不同,有的是单纯的设置位置,提供一个CRect即可,有的是要提供窗体句柄甚至还要采集卡的句柄,你查一下SDK的帮助文档,应该有介绍的
    或者你就在例子程序中找,肯定能找到的。
    然后在视频窗口的OnSize事件中GetClientRect之后设置视频表面位置 OnMove事件中SendMessage(WM_SIZE),若窗口大小是固定的,则只需在OnSize里处理视频表面位置即可
      

  5.   

    第一个问题已经解决,重载窗体类的OnMove的函数加自己的代码。第二个还没搞定,救命啊!
      

  6.   

    第二个好像不好解决
    有可能是因为视频是DirectxShow出来的,而不是采用的GDI方式
    视频表面处于整个屏幕的最上方
    你试试看这个视频表面会不会把Windows任务管理器给挡住。
    冻结图像时其实就是把视频表面图像存进了内存Bitmap画在了窗口上好像DirectxShow有个透明色什么的,视频表面可以穿过显示屏上透明色的区域,也许有Api可以设置一下
    你看看Demo程序中在实时显示视频时,别的窗口能否挡住视频表面
    有的采集卡可以设置成GDI方式显示视频,这样就不会发生这样的问题,不过视频效果要打折扣
      

  7.   

    “有可能是因为视频是DirectxShow出来的,而不是采用的GDI方式
    视频表面处于整个屏幕的最上方
    你试试看这个视频表面会不会把Windows任务管理器给挡住。”没错,挡住了。“Demo程序中在实时显示视频时,别的窗口能否挡住视频表面”是这样的!Demo程序中使用的
    status = CGCapture(m_hcg, TRUE);
    就这一句直接调用采集卡控制函数就完成了输出到屏幕工作。当然之前进行了:
    CGSTATUS status = CG_OK;
    CView *pView = NULL;
    RECT rcCliet = {0};
    RECT rcVideo = {0}; CGSetVideoFormat(m_hcg , m_VideoFormat);
    //
    pView = GetActiveView();
    ASSERT(pView);
    pView->GetClientRect(&rcCliet);
    pView->ClientToScreen(&rcCliet);

    rcVideo = rcCliet; ASSERT(pView);
    CGSetScanMode(m_hcg,m_ScanMode);
    CGSetInputWindow(m_hcg,
    0, 
    0, 
    768, 
    576
    );

    // 设置视频输出窗口
    CGSetOutputWindow(m_hcg, 
    rcVideo.left , 
    rcVideo.top , 
    768, 
    576
    );
    看现象适合你说的一样,设置成GDI方式显示视频了。
    但我不明白是怎么做到的。我在查一下DirectxShow和GDI方式。呵呵,不懂,要学下!
    谢谢你(dazedase)!
      

  8.   

    谢谢你(dazedase)! 
    给分了!!!!