我在网上看了很多运用回调函数的,我照着运用但为什么不行?
MSDN上关于capSetCallbackOnFrame(句柄,回调函数名),我这样用有什么错误,代码如下:
CRect rect; //取得主窗口客户区域的位置和大小 
               {..........
GetClientRect(&rect);
//创建视频窗口
Hwndcap=picCatch.CreateCaptureWindow((LPCSTR)"视频采集窗口",0,0,rect.Width(),rect.Height(),this->m_hWnd);
if(Hwndcap)
{
//创建窗口和驱动的连接
if(picCatch.DriverConnect(Hwndcap))
{
//视频捕获的参数设置
picCatch.PicCaptureParameterSet(Hwndcap);
}
else
{
{
MessageBox("视频设备没有连接好!");
::DestroyWindow(Hwndcap);
Hwndcap=NULL;
}
}
             capSetCallbackOnFrame(Hwndcap, FrameCallbackProc);
}
                } LRESULT   PASCAL   FrameCallbackProc(HWND   hWnd,   LPVIDEOHDR   lpVHdr)
{
   .....................
}这个FrameCallbackProc还用进行声明吗?我编译后的错误提示就是FrameCallbackProc没有被声明。
请高手指点!谢谢。

解决方案 »

  1.   

    以上我是在View类中完成的,关于帧处理的回调函数要在哪里注册?CMainFrame类吗?
    我看了一个高手的代码后我编写代码如下:一下都是在CMainFrame类中完成:
    public:
    static LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr);#include "CMyDoc.h"
    #include "CMyView.h"#include "vfw.h"
    .cpp中
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    ..................................
    //他说这是注册这个回调函数
    CFrameWnd *pMain;
    CCatchPic2View *pChild=(CCatchPic2View *)(pMain->GetActiveView());
    capSetCallbackOnFrame(pChild->Hwndcap,&FrameCallbackProc);
    }LRESULT CALLBACK CMainFrame::FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
    {
            ................
    return TRUE;
    }错误如下:
    1.mainfrm.h(34) : error C2061: syntax error : identifier 'LPVIDEOHDR'
    2.rror C2511: 'FrameCallbackProc' : overloaded member function 'long (struct HWND__ *,struct videohdr_tag *)'请大家帮忙!我会加分的,谢谢。
      

  2.   

    1.mainfrm.h中没有包含"vfw.h" ,你直接在stdAfx.h中包含 "vfw.h" ,不要忘记了#pragma comment(lib,"vfw32")你给邮箱,我给你发分代码算了
      

  3.   


    [email protected]谢谢了。一定给您加分
      

  4.   

    有没有用过视频采集的回调函数的lpVHdr进行保存,我出了问题。LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
    {
    HANDLE hFile = CreateFile("F:\\1\\SUNHUI.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,    
                          FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);  
    BITMAPINFOHEADER bih;
        BITMAPFILEHEADER bfh;
        ZeroMemory(&bfh, sizeof(bfh));
    ZeroMemory(&bih, sizeof(bih)); 
    DWORD dwSize, dwWritten;
    dwSize = capGetVideoFormatSize(hWnd);
    capGetVideoFormat(hWnd, &bih, dwSize);
    DWORD biCompression=(DWORD)bih.biCompression;
    DWORD height=(DWORD)bih.biHeight ;
    DWORD width=(DWORD)bih.biWidth;
    DWORD bicount=(DWORD)bih.biBitCount;
    DWORD bisize=(DWORD)bih.biSizeImage;

    DWORD bmpsize=WIDTHBYTES(width*bicount)*height;  //(((bits)+31)/32*4)
        bfh.bfType = 'MB';  // Little-endian for "MB".
        bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lpVHdr->dwBytesUsed;
    bfh.bfReserved1 = 0;    
    bfh.bfReserved2 = 0;    
    bfh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
    WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
    WriteFile(hFile, lpVHdr->lpData, lpVHdr->dwBytesUsed, &dwWritten, NULL);
    CloseHandle(hFile);  
        return (LRESULT) TRUE ; }能不能帮一下忙啊!急急急!
      

  5.   

    其他地方没有什么问题,这个参数hWnd并不是捕获窗口句柄,是你们在设置回调函数之前设置的用户数据。所以你调用dwSize = capGetVideoFormatSize(hWnd); 
    capGetVideoFormat(hWnd, &bih, dwSize); 都会失败,没有获得正确的位图头信息,所以你保存的位图文件会失败。我写了个Demo发到你的邮箱了。
      

  6.   

    vfw还有个特点:当窗口最小化,或者被遮挡部分后,捕获窗口就捕获不到视频数据了,回调函数就没有数据来了