怎样在一个DLL中实现一个视频窗口? 我想在dll中封装一个视频窗口,实现来自视频卡的视频显示 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 extern "C" BOOL __declspec(dllexport) CreateVideoWindow(int nCard);//创建视频窗口BOOL CreateVideoWindow(int nCard){ AFX_MANAGE_STATE(AfxGetStaticModuleState()); //CDlgVideo dlg; //dlg.DoModal();//模态对话框的创建 //非模态对话框的创建 pDlg = new CDlgVideo; if(pDlg != NULL) { BOOL ret = pDlg->Create(IDD_DLG_VIDEO,AfxGetMainWnd()); CRect rect; pDlg->GetClientRect(&rect); m_hVideo = ::GetDlgItem(pDlg->GetSafeHwnd(),IDC_STATIC_VIDEO); if(m_hVideo != NULL) CreateCapWindow(m_hVideo,nCard,rect); else { AfxMessageBox("创建视频失败"); return FALSE; } pDlg->ShowWindow(SW_NORMAL); return TRUE; } else { return FALSE; }}//BOOL CreateCapWindow(HWND hParent,int nCard,CRect rect){ //m_hVideo = CreateWindowEx(WS_EX_TOPMOST,"Static",NULL,WS_BORDER,//"Static" is "System Classes" // 0,0,300,300,hParent,NULL,NULL,0); m_hWndCap=capCreateCaptureWindow((LPSTR)"Video Capture Window", WS_EX_CONTROLPARENT|WS_CHILD|WS_VISIBLE, rect.left, rect.top, rect.Width(), rect.Height(), hParent,0); //::ShowWindow(m_hVideo,SW_SHOW); capSetCallbackOnError(m_hWndCap,(FARPROC)ErrorCallbackProc); capSetCallbackOnStatus(m_hWndCap,(FARPROC)StatusCallbackProc); capSetCallbackOnVideoStream(m_hWndCap,(FARPROC)VideoCallbackProc); int nIsConnect = 0; if(nCard != -1) { if(capDriverConnect(m_hWndCap,nCard)) nIsConnect = 1; else nIsConnect = 0; } else { for(int i =0 ;i<=9;i++) { if(capDriverConnect(m_hWndCap,i))//connect to the first VIDEOdriver { nIsConnect = 1; break; } else { nIsConnect =0; } } } if(nIsConnect) { capDriverGetCaps(m_hWndCap,&m_caps,sizeof(CAPDRIVERCAPS)); capOverlay(m_hWndCap, true); return TRUE; } else { return FALSE; }}BOOL DisConnect(){ if(capDriverDisconnect(m_hWndCap)) return TRUE; else { AfxMessageBox("断开视频卡失败"); return FALSE; }}//LRESULT CALLBACK EXPORT ErrorCallbackProc(HWND hWnd,int nErrID, LPSTR lpErrorText){ if(nErrID==0) return TRUE; AfxMessageBox(lpErrorText,MB_OK,NULL); return TRUE;}LRESULT FAR PASCAL StatusCallbackProc(HWND hWnd,int nID, LPSTR lpStatusText){ static int CurrentID; if(nID==IDS_CAP_END) { if((CurrentID==IDS_CAP_STAT_VIDEOAUDIO)|| (CurrentID==IDS_CAP_STAT_VIDEOONLY)) return (TRUE); } CurrentID=nID; return (LRESULT)TRUE;}LRESULT FAR PASCAL VideoCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr){ //return(LRESULT)TRUE; ((LPBITMAPINFOHEADER)(m_dibinfo.buffer))->biSizeImage = lpVHdr->dwBytesUsed; memcpy(m_dibinfo.buffer+ m_dibinfo.VideoFormatSize, lpVHdr->lpData,lpVHdr->dwBytesUsed); return(LRESULT)TRUE;}// CreateVideoWindow(int nCard)其中nCard为要连接的视频卡(0~~~9),为-1时将自动查找。 typedef struct{ int VideoFormatSize;//bitmap headsize char buffer[32000];//bitmap head and data}DIBINFO,*PDIBINFO;HWND m_hVideo;HWND m_hWndCap;CDlgVideo* pDlg;CAPDRIVERCAPS m_caps;DIBINFO m_dibinfo; 一个组件有多个接口,那么任意一个接口都可以用来CreateInstance()么? MFC求access数据库备份 [弱问]为啥我的CListCtrl中InsertColumn无效? 链接问题 怎么样打开IE的选项对话框中的安全属性页?? 如何用程序读出控制面板中已安装的应用程序列表 "建立空文档失败"是什么意思? 如何启动屏幕保护(在线等待) 请各位帮忙看看下面的调用DLL的代码,为什么没有结果呢 如果按字符串输出在界面,点左键怎么让光标自动在字符间闪烁呐? 对完成端口熟悉的朋友近来看看!!!!在线等!!解决就加分!!!!!!! 各位大虾快来帮帮我!我要崩溃了!
BOOL CreateVideoWindow(int nCard)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//CDlgVideo dlg;
//dlg.DoModal();//模态对话框的创建 //非模态对话框的创建
pDlg = new CDlgVideo;
if(pDlg != NULL)
{
BOOL ret = pDlg->Create(IDD_DLG_VIDEO,AfxGetMainWnd());
CRect rect;
pDlg->GetClientRect(&rect);
m_hVideo = ::GetDlgItem(pDlg->GetSafeHwnd(),IDC_STATIC_VIDEO);
if(m_hVideo != NULL)
CreateCapWindow(m_hVideo,nCard,rect);
else
{
AfxMessageBox("创建视频失败");
return FALSE;
} pDlg->ShowWindow(SW_NORMAL);
return TRUE;
}
else
{
return FALSE;
}
}
//
BOOL CreateCapWindow(HWND hParent,int nCard,CRect rect)
{
//m_hVideo = CreateWindowEx(WS_EX_TOPMOST,"Static",NULL,WS_BORDER,//"Static" is "System Classes"
// 0,0,300,300,hParent,NULL,NULL,0);
m_hWndCap=capCreateCaptureWindow((LPSTR)"Video Capture Window",
WS_EX_CONTROLPARENT|WS_CHILD|WS_VISIBLE, rect.left, rect.top, rect.Width(), rect.Height(), hParent,0);
//::ShowWindow(m_hVideo,SW_SHOW);
capSetCallbackOnError(m_hWndCap,(FARPROC)ErrorCallbackProc);
capSetCallbackOnStatus(m_hWndCap,(FARPROC)StatusCallbackProc);
capSetCallbackOnVideoStream(m_hWndCap,(FARPROC)VideoCallbackProc);
int nIsConnect = 0;
if(nCard != -1)
{
if(capDriverConnect(m_hWndCap,nCard))
nIsConnect = 1;
else
nIsConnect = 0;
}
else
{
for(int i =0 ;i<=9;i++)
{
if(capDriverConnect(m_hWndCap,i))//connect to the first VIDEOdriver
{
nIsConnect = 1;
break;
}
else
{
nIsConnect =0;
}
}
}
if(nIsConnect)
{
capDriverGetCaps(m_hWndCap,&m_caps,sizeof(CAPDRIVERCAPS));
capOverlay(m_hWndCap, true);
return TRUE;
}
else
{
return FALSE;
}
}
BOOL DisConnect()
{
if(capDriverDisconnect(m_hWndCap))
return TRUE;
else
{
AfxMessageBox("断开视频卡失败");
return FALSE;
}
}
//
LRESULT CALLBACK EXPORT ErrorCallbackProc(HWND hWnd,int nErrID,
LPSTR lpErrorText)
{
if(nErrID==0)
return TRUE;
AfxMessageBox(lpErrorText,MB_OK,NULL);
return TRUE;
}LRESULT FAR PASCAL StatusCallbackProc(HWND hWnd,int nID,
LPSTR lpStatusText)
{
static int CurrentID;
if(nID==IDS_CAP_END)
{
if((CurrentID==IDS_CAP_STAT_VIDEOAUDIO)||
(CurrentID==IDS_CAP_STAT_VIDEOONLY))
return (TRUE);
}
CurrentID=nID;
return (LRESULT)TRUE;}
LRESULT FAR PASCAL VideoCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr)
{
//return(LRESULT)TRUE;
((LPBITMAPINFOHEADER)(m_dibinfo.buffer))->biSizeImage
= lpVHdr->dwBytesUsed; memcpy(m_dibinfo.buffer+
m_dibinfo.VideoFormatSize,
lpVHdr->lpData,lpVHdr->dwBytesUsed); return(LRESULT)TRUE;
}
//
其中nCard为要连接的视频卡(0~~~9),为-1时将自动查找。
int VideoFormatSize;//bitmap headsize
char buffer[32000];//bitmap head and data
}DIBINFO,*PDIBINFO;HWND m_hVideo;
HWND m_hWndCap;
CDlgVideo* pDlg;
CAPDRIVERCAPS m_caps;
DIBINFO m_dibinfo;