这样子的,我现在编写一个社区的视频监控软件,有开发的SDK,不过那个编写的是单文本的,我现在想用对话框来编。但我不知道怎样在对话框中显示视频,是添加一个控件?还是直接绘制?开发包中,显示部分函数的主要代码:
LRESULT CMainFrame::OnSnapExChange(WPARAM wParam, LPARAM lParam)
{
CGSTATUS status = CG_OK; CView *pView = GetActiveView(); // 获取当前VIEW视图
CDC *pDC  = pView->GetDC(); // 得到VIEW的DC

BYTE *pLinearAddr = NULL; // 静态内存地址指针
DWORD dwImageSize = 0; // 图像大小
HANDLE handle = NULL; // 静态内存描述句柄

dwImageSize = lBmpWidth * lBmpHeight * 3; // 计算图像大小,由视频输出窗口和视频格式确定 BYTE *p=NULL, *q=NULL; /*
 * 锁定指定位置的静态内存,
 * 偏移由图像大小和图像序号确定,锁定大小为图像大小
 * 用户可以在任何时候锁定指定位置的静态内存,然后通过pLinearAddr指针访问相应的内存。
 */
status = CGStaticMemLock(dwImageSize * wParam, dwImageSize, &handle, (PVOID *)&pLinearAddr);
if (CG_SUCCESS(status)) 
{
if (m_pImageBuffer) 
{
/*
 * 将静态内存中的图像传递到用户缓冲区,同时进行格式转换。
 * 如果静态内存中图像为15、16、32位,则转换为24位。
 * 由于图像卡采集到静态内存的图像数据是正向存放,
 * 而Windows中处理的位图数据需要倒置,因此一般还要将图像倒置。
 */
CGDataTransform(m_pImageBuffer, // 图像缓冲区
pLinearAddr, // 静态内存
lBmpWidth, // 图像宽度
lBmpHeight, // 图像高度
24, // 图像位深度
true // 对图象数据进行倒置,以符合BMP位图存储格式
       );
}
CGStaticMemUnlock(handle); // 解除静态内存锁定

//在视图客户区显示图像
StretchDIBits(pDC->GetSafeHdc(),
     0,
     0,
    lBmpWidth,//768, //显示窗口宽度
    lBmpHeight,//576, //显示窗口高度
     0,
     0,
    lBmpWidth,//768, //图像宽度
    lBmpHeight,//576,          //图像高度
    m_pImageBuffer, //图像缓冲区
    m_pBmpInfo, //BMP图像描述信息
    DIB_RGB_COLORS,
    SRCCOPY
   );
pView->ReleaseDC(pDC);

return 1;
}这个是将视频在单文本的VIEW框中显示,我想在对话框中显示,我试图得到当前窗口,然后用StretchBlt函数实现,但没效果,求教各位大神给点指示!感激不尽。本人QQ 281131828,常年在线

解决方案 »

  1.   

    // 放一个控件,比如Picture之类的,然后对控件GetDC(),之后的就差不多了。
      

  2.   

    LRESULT CMainFrame::OnSnapExChange(WPARAM wParam, LPARAM lParam)
    我对这个函数并不怎么了解,所以我在对话框的编辑中采用了一个
    void CMyDlg::OnSnapexShow();即通过一个按钮实现,但这个时候status = CGStaticMemLock(dwImageSize * wParam, dwImageSize, &handle, (PVOID *)&pLinearAddr);这个函数里的wParam参数就没了怎么办?谢谢
      

  3.   

    OnSnapExChange是个消息函数么?
    看看它的消息映射是怎么连接的
      

  4.   

    StretchDIBits只要是这个函数。
    按道理应该可以在dlg上直接绘图。
      

  5.   

    在大的对话框中直接创建一个小的对话框就可以实现,而且多创建几个,还可以实现分屏现实。我们就这么做的。至于你提的问题,我有的想法是:
    LRESULT CMainFrame::OnSnapExChange(WPARAM wParam, LPARAM lParam)
    这个函数肯定是其他的函数发送过来的消息,一般而言,你用对方的库,他都会提供你一个回调函数,回调函数里面肯定会有反馈给上层的视频数据,你可以在回调函数里面,调用你的自己的函数,这样直接就可以获得想要的信息了。
    如果你没有看到回调函数,只有找OnSnapExChange这个消息的发送源,然后在发送源位置,调用自己的函数来替换OnSnapExChange,这样也可以实现。
      

  6.   

    正解,我们之前买的那一套维视产品就是这么开发,现在换了一套成本低的产品,只给了一个doc文档和一个dll文件,都无语了,开发起来比那个困难多了。我现在就是不知道怎么将视频显示在对话框的Picture控件中,请高手给个详解。
    BOOL TwRegisterVideoStreamCallback(TwVideoStreamCallback VideoStreamCallback, void *Context)
    功能:注册视频数据流回调函数
    参数:[in]VideoStreamReadCallback,指定的回调函数指针
      [in]Context,指定的回调函数上下文指针
    返回:成功返回TRUE,否则返回FALSE,调用TwGetLastError获取错误码