我想在dll中封装一个视频窗口,实现来自视频卡的视频显示

解决方案 »

  1.   

    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;
    }
    //
      

  2.   

    CreateVideoWindow(int nCard)
    其中nCard为要连接的视频卡(0~~~9),为-1时将自动查找。
      

  3.   

    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;