这样子的,我现在编写一个社区的视频监控软件,有开发的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,常年在线
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,常年在线
我对这个函数并不怎么了解,所以我在对话框的编辑中采用了一个
void CMyDlg::OnSnapexShow();即通过一个按钮实现,但这个时候status = CGStaticMemLock(dwImageSize * wParam, dwImageSize, &handle, (PVOID *)&pLinearAddr);这个函数里的wParam参数就没了怎么办?谢谢
看看它的消息映射是怎么连接的
按道理应该可以在dlg上直接绘图。
LRESULT CMainFrame::OnSnapExChange(WPARAM wParam, LPARAM lParam)
这个函数肯定是其他的函数发送过来的消息,一般而言,你用对方的库,他都会提供你一个回调函数,回调函数里面肯定会有反馈给上层的视频数据,你可以在回调函数里面,调用你的自己的函数,这样直接就可以获得想要的信息了。
如果你没有看到回调函数,只有找OnSnapExChange这个消息的发送源,然后在发送源位置,调用自己的函数来替换OnSnapExChange,这样也可以实现。
BOOL TwRegisterVideoStreamCallback(TwVideoStreamCallback VideoStreamCallback, void *Context)
功能:注册视频数据流回调函数
参数:[in]VideoStreamReadCallback,指定的回调函数指针
[in]Context,指定的回调函数上下文指针
返回:成功返回TRUE,否则返回FALSE,调用TwGetLastError获取错误码