VFW视频捕获显示问题

hs205118hs205118 2013-05-23 02:37:18
描述:
采用VFW捕获视频。在capSetCallbackOnVideoStream的回调函数中,将LPVIDEOHDR中的数据传递给显示视频的窗口ShowVideoDlg(里面有显示视频的函数:ShowVideo2Window)。然后在ShowVideo2Window中用DrawDibDraw将传递的LPVIDEOHDR中的数据显示出来。
其显示出来的效果如图:,左上角是直接预览的。而右下角的线条视频是在ShowVideo2Window中显示出来的。
我的程序是参考了网上的一个代码,并且其运行他的代码效果也是一样的。我将这个程序编译然后在别的电脑上运行了下,效果也一样。

问题:
(1)有谁遇到过这是什么问题呢?有好的解决办法没。(不准备采用directShow,就针对这个问题)
(2)既然能预览视频,那么与摄像头与显示无关。而且参考的代码也有不少人说好,没有人出现我这样的问题,所以,猜测可能是与我硬件方面有关。但是在别的电脑上运行效果一样,我就不知道该如何判断了。但是,我猜测可能是捕获的视频数据有问题。会不会是我捕获的数据格式问题。不是rgb格式的数据。因此,问题是:我有没有办法分析出这些捕获的数据是RGB的还是什么格式的?
...全文
532 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiffany_chen 2015-10-28
  • 打赏
  • 举报
回复
@满衣兄 太感谢你了,直接就把我纠结了三天的win7下VFW视频采集黑屏的问题解决了!太感谢了!也谢谢楼主的问题。才有这种解决方法,赞一个!值得分享!!!
beautive 2013-11-21
  • 打赏
  • 举报
回复
最近也遇到了同样的问题,能把你代码发给我学习学习么?jishao538@163.com
满衣兄 2013-05-24
  • 打赏
  • 举报
回复
大哥,改好了: Initialize中BITMAPINFO注释掉一部分,不然capSetVideoFormat函数调用失败,另外将返回值改成1。 capSetVideoFormat函数调用失败的原因应该是你自己填充的格式不支持。 代码已发送到你邮箱,结贴哦。


BOOL VideoCapture::Initialize(CVideoShowDlg *thisS)
{
	TCHAR szName[MAX_PATH] = {0};
	TCHAR szVer[MAX_PATH]  = {0};

	BOOL bRet = capGetDriverDescription(0, szName, MAX_PATH, szVer, MAX_PATH);
	if (!bRet)
	{
		return -1;
	}

	HWND m_hWnd = capCreateCaptureWindow(szName, WS_VISIBLE | WS_CHILD, 100, 100, 100, 100, thisS->m_hWnd, 0);

	capSetUserData(m_hWnd,this);

	int tryTimes = 0;
	bool ret = FALSE;
	while ((ret = capDriverConnect(m_hWnd, 0)) != TRUE)
	{
		if(++tryTimes > 10)
			break;
	}
	if(ret == TRUE)
	{
		capPreviewRate(m_hWnd, 66);
		capPreview(m_hWnd, TRUE);
		capPreviewScale(m_hWnd, TRUE);

		//BITMAPINFO bitmapinfo;
		//bitmapinfo.bmiHeader.biSize     = sizeof(bitmapinfo.bmiHeader);
		//bitmapinfo.bmiHeader.biWidth    = 100;
		//bitmapinfo.bmiHeader.biHeight   = 100;
		//bitmapinfo.bmiHeader.biPlanes   = 1;
		//bitmapinfo.bmiHeader.biBitCount = 24;*/
		capGetVideoFormat(m_hWnd,&m_bmpinfo,sizeof(m_bmpinfo)); //获得当前video格式
		//m_bmpinfo.bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
		m_bmpinfo.bmiHeader.biWidth     = IMAGE_WIDTH;
		m_bmpinfo.bmiHeader.biHeight     = IMAGE_HEIGHT;
		//m_bmpinfo.bmiHeader.biBitCount     = 24;
		//m_bmpinfo.bmiHeader.biPlanes     = 1;    
		//m_bmpinfo.bmiHeader.biCompression     = BI_RGB;//采用RGB压缩格式
		//m_bmpinfo.bmiHeader.biSizeImage     =IMAGE_WIDTH*IMAGE_HEIGHT*3;
		//m_bmpinfo.bmiHeader.biXPelsPerMeter    = 0;
		//m_bmpinfo.bmiHeader.biYPelsPerMeter    = 0;
		//m_bmpinfo.bmiHeader.biClrUsed     =0;
		//m_bmpinfo.bmiHeader.biClrImportant    = 0;
		BOOL ret=capSetVideoFormat(m_hWnd,&m_bmpinfo,sizeof(m_bmpinfo)); 

		//capSetVideoFormat(m_hWnd, &m_bmpinfo, sizeof(m_bmpinfo));
		capSetCallbackOnFrame(m_hWnd, OnCaptureVideo);
		//设置视频流回调函数
		//将user数据设为AVIOMgr对象指针
		if(!capSetUserData(m_hWnd,(DWORD)this))
			return 1;

		SetWindowPos(m_hWnd, NULL, 500, 500, 100, 
			100, SWP_NOZORDER | SWP_NOMOVE); 
	}

	return 1;

}
hs205118hs205118 2013-05-24
  • 打赏
  • 举报
回复
呵呵。相当感谢yfqvip啊。花了不少时间帮我解决这个问题。为防止另外有人遇到我同样的问题,说下原因:可能是vfw太老,与硬件方面不兼容,后来直接将 m_bmpinfo.bmiHeader.biWidth = IMAGE_WIDTH; m_bmpinfo.bmiHeader.biHeight = IMAGE_HEIGHT;这样的自己的设置全部给干掉后出现效果了。嘿嘿。
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
顶一顶,求大神帮助啊
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
自己顶一顶,求解释啊。
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:
没有:“"CapPicture.h"” !!!
没有CapPicture.h?什么意思呢?
schlafenhamster 2013-05-23
  • 打赏
  • 举报
回复
没有:“"CapPicture.h"” !!!
满衣兄 2013-05-23
  • 打赏
  • 举报
回复
还没调出来,回家吃饭了
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 9 楼 yfqvip 的回复:
引用 8 楼 hs205118hs205118 的回复:
[quote=引用 6 楼 yfqvip 的回复:] [quote=引用 4 楼 hs205118hs205118 的回复:] [quote=引用 2 楼 yfqvip 的回复:] 单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
yfqvip#163.com 我调试一下看看 不保证能调出来哦[/quote]提示说邮箱格式错误。yfqvip#163.com[/quote] #改成@啊 @163.com[/quote]收到了吗????找出原因了吗???在线等啊。弄出来了就给我个邮件或信息呢。
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 6 楼 yfqvip 的回复:
引用 4 楼 hs205118hs205118 的回复:
[quote=引用 2 楼 yfqvip 的回复:] 单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
yfqvip#163.com 我调试一下看看 不保证能调出来哦[/quote]yfqvip@163.com?,已经发了,收到否?我的QQ,395004624。要是可以,麻烦加下。
满衣兄 2013-05-23
  • 打赏
  • 举报
回复
引用 8 楼 hs205118hs205118 的回复:
引用 6 楼 yfqvip 的回复:
[quote=引用 4 楼 hs205118hs205118 的回复:] [quote=引用 2 楼 yfqvip 的回复:] 单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
yfqvip#163.com 我调试一下看看 不保证能调出来哦[/quote]提示说邮箱格式错误。yfqvip#163.com[/quote] #改成@啊 @163.com
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 6 楼 yfqvip 的回复:
引用 4 楼 hs205118hs205118 的回复:
[quote=引用 2 楼 yfqvip 的回复:] 单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
yfqvip#163.com 我调试一下看看 不保证能调出来哦[/quote]提示说邮箱格式错误。yfqvip#163.com
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 6 楼 yfqvip 的回复:
引用 4 楼 hs205118hs205118 的回复:
[quote=引用 2 楼 yfqvip 的回复:] 单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
yfqvip#163.com 我调试一下看看 不保证能调出来哦[/quote] 在发送,网速真不给力。恩,实在麻烦你了。
满衣兄 2013-05-23
  • 打赏
  • 举报
回复
引用 4 楼 hs205118hs205118 的回复:
引用 2 楼 yfqvip 的回复:
单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
yfqvip#163.com 我调试一下看看 不保证能调出来哦
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 3 楼 g6785654 的回复:
有点看不懂lz的意思,这里有一个简单的win32用VFW预览和录像的代码,lz可以参考下

#include <windows.h>
#include <vfw.h>
#include <commdlg.h>
#include "CapPicture.h"

LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM ); 
LRESULT WINAPI SelCapDrvProc( HWND, UINT, WPARAM, LPARAM );
int EnumCapDrv();
VOID APIENTRY HandlePopupMenu(HWND, POINT);
DWORD WINAPI videoThreadProc(LPVOID lParam);


HANDLE ghInstance;
HWND hwndMain;
HWND hwndVideo;
HWND hwndSelCapDrvDlg;
HWND hwndSelCapDrvDlg_LBox;
HWND hwndExit;
HWND hwndMin;
HWND hwndHelp;
HWND hwndRecord;
HANDLE hVideoThread;
HRGN hRegion1;
CAPDRIVERCAPS CapDrvCaps;
bool isRecordFileOpen = false;
char recordFile[260];
bool isPicFileOpen = false;
char pictureFile[260];
bool isRecording = false;
bool threadEnd = false;

int PASCAL WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,

    LPSTR lpszCmdLine,
    int nCmdShow )
{
   WNDCLASS wc;
   MSG msg;

   if( !hPrevInstance )
   {
      wc.lpszClassName = "GenericAppClass";
      wc.lpfnWndProc = MainWndProc;
      wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
      wc.hInstance = hInstance;
      wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      wc.hCursor = LoadCursor( NULL, IDC_ARROW );
      wc.hbrBackground = CreateSolidBrush (RGB(196, 200, 204));
      wc.lpszMenuName = "GenericAppMenu";

      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;

      RegisterClass( &wc );
   }

   ghInstance = hInstance;

   hwndMain = CreateWindow( "GenericAppClass",
      "Super Video",
      WS_POPUP,
      100,
      100,
      500,
      500,
      NULL,
      NULL,
      hInstance,
      NULL
   );

   ShowWindow( hwndMain, nCmdShow );
   SetWindowRgn(hwndMain,hRegion1,1);

   while( GetMessage( &msg, NULL, 0, 0 ) ) {
      TranslateMessage( &msg );

      DispatchMessage( &msg );
   }

   return msg.wParam;
}

LRESULT CALLBACK MainWndProc( HWND hwndMain, UINT msg, WPARAM wParam,
   LPARAM lParam )
{
   HDC hDC = GetDC(hwndMain);
   RECT rc;           
   POINT pt;  

   switch( msg ) {
	  case WM_LBUTTONDBLCLK:
	  	    SetFocus(hwndMain);
	  	    break;
      case WM_RBUTTONDOWN: 
            GetClientRect(hwndMain, (LPRECT) &rc); 
            pt.x = LOWORD(lParam); 
            pt.y = HIWORD(lParam); 
            if (PtInRect((LPRECT) &rc, pt)) 
                HandlePopupMenu(hwndMain, pt); 
            break; 
      case WM_PAINT:
         FrameRgn(hDC,hRegion1,CreateSolidBrush(RGB(0,0,0)),2,2); 
  		 BringWindowToTop(hwndSelCapDrvDlg);
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));
	  case WM_COMMAND:
	  	 CAPSTATUS CapStatus;
	  	 switch( wParam ) {
 		
		 	case SOURCE:
	  	 	   if(CapDrvCaps.fHasDlgVideoSource)
	  	 	   		capDlgVideoSource(hwndVideo);
	  	 	   break;
	  	 	case FORMAT:
	  	 	   if(CapDrvCaps.fHasDlgVideoFormat)
	  	 	   {		
	  	 	   		capDlgVideoFormat(hwndMain);
	  	 	   		capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
	  	 	   		SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
	  	 	   					CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
	  	 	   }
	  	 	   break;
	  	 	case DISPLAY:
	  	 		if (CapDrvCaps.fHasDlgVideoDisplay)
	  	 			capDlgVideoDisplay(hwndVideo);
	  	 		break;
            case EXIT:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
               break;
            case MINIMIZE:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
               break;
            case HELP:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
               break;
            case RECORDVIDEO:
            if(HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndRecord)
            {
			   if (!isRecordFileOpen)
			   {
			   		OPENFILENAME ofn;
			   		ZeroMemory(&ofn, sizeof(OPENFILENAME));
					ofn.lStructSize = sizeof(OPENFILENAME);
					ofn.hwndOwner = hwndMain;
					ofn.lpstrFile = recordFile;
					ofn.nMaxFile = sizeof(recordFile);
					ofn.lpstrFilter = "Video\0*.avi";
					ofn.nFilterIndex = 1;
					ofn.lpstrFileTitle = NULL;
					ofn.nMaxFileTitle = 0;
					ofn.lpstrInitialDir = NULL;
					ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
					if(GetSaveFileName(&ofn) == TRUE)
					{
						strcpy(recordFile, ofn.lpstrFile);
						strcat(recordFile, ".avi");
						isRecordFileOpen = true; 
						DWORD id;
						SECURITY_ATTRIBUTES sa;
						sa.nLength = sizeof(SECURITY_ATTRIBUTES);
						sa.lpSecurityDescriptor = NULL;
						sa.bInheritHandle = TRUE;
						hVideoThread = CreateThread(&sa, (ULONG)0, 
											videoThreadProc, (LPVOID)(ULONG)0, (ULONG)0, &id);		
						if(hVideoThread == NULL)
							MessageBox(NULL, "Creation of Record Thread failed!", "Thread", MB_OK | MB_ICONEXCLAMATION);
						
						break;
					}
				}

				if (isRecordFileOpen) 
				{
					if(isRecording)
					{
						threadEnd = true;
						capFileSaveAs(hwndVideo, recordFile);
						SetWindowText(hwndRecord, "Record Video");
						isRecording = false;
						break;
					}
					
					if(!isRecording )
					{
						int a = 0;
						
						MessageBox(hwndMain, "Do you want to write over the open file?",
									"File warning", MB_YESNO | MB_ICONWARNING);
						if (a != IDYES)
						{
							isRecordFileOpen = false;
							SendMessage(hwndMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM) hwndRecord);
						}
						
						if (a == IDYES)
						{
							capCaptureSequence(hwndVideo);
							isRecording = true;
						}
						
					break;
					}
				}
			}	
         	break;
         }
      break;
     case WM_CREATE:
      
      	RECT helpRect, minRect, exitRect;
      	HRGN helpRgn, minRgn, exitRgn;
        hRegion1 = CreateRoundRectRgn(100,100,500, 500,20,20);   
	  	hwndVideo = capCreateCaptureWindow(
	  					(LPSTR) "My Capture Window",
	  					WS_CHILD | WS_VISIBLE,
	  					150, 150, 300, 280,
	  					(HWND) hwndMain,
	  					(int) 1);
		hwndExit = CreateWindow (
				"button",
				"x",
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
				470, 110, BUTTONSIZE, BUTTONSIZE,
				hwndMain,
				(HMENU) EXIT,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);
		hwndMin = CreateWindow (
				"button",
				"-",
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
				450, 110, BUTTONSIZE, BUTTONSIZE,
				hwndMain,
				(HMENU) MINIMIZE,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);  		
		hwndHelp = CreateWindow (
				"button",
				"?",
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
				430, 110, BUTTONSIZE, BUTTONSIZE, 
				hwndMain, 
				(HMENU) HELP,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);
		hwndRecord = CreateWindow (
				"button", 
				"录像", 
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER, 
				250, 464, 90, 28,
				hwndMain, 
				(HMENU) RECORDVIDEO,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);				
				
	  	GetClientRect(hwndHelp, &helpRect);
	  	GetClientRect(hwndMin, &minRect);
	  	GetClientRect(hwndExit, &exitRect);
	  		  		  	
	  	helpRgn = CreateEllipticRgnIndirect(&helpRect);
		minRgn = CreateEllipticRgnIndirect(&minRect);
		exitRgn = CreateEllipticRgnIndirect(&exitRect);
	  		  		
	    SetWindowRgn(hwndExit,exitRgn,1);
	    SetWindowRgn(hwndMin,minRgn,1);					  		  		
	    SetWindowRgn(hwndHelp,helpRgn,1);				
	
		hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance, 
										MAKEINTRESOURCE( SELCAPDRVDLG  ), 
										0, (DLGPROC)SelCapDrvProc);
		hwndSelCapDrvDlg_LBox = GetDlgItem(hwndSelCapDrvDlg, 
   										   SELCAPDRVDLG_LSTBOX);
	    EnumCapDrv();
      break;
      case WM_DESTROY:
      	 capPreview(hwndVideo, FALSE);
      	 capDriverDisconnect(hwndVideo);
         PostQuitMessage( 0 );
         break;
      default:
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));

   }

   return 0;
}

LRESULT CALLBACK SelCapDrvProc( HWND hWnd, UINT msg, 
								WPARAM wParam, LPARAM lParam )
{

	switch(msg)
	{
		case WM_INITDIALOG:
		    return TRUE;
		case WM_COMMAND:
			switch ( wParam )
			{
				case SELCAPDRVDLG_BUTTON:
					int sel = 0;
					SendMessage( hwndSelCapDrvDlg_LBox, LB_GETSELITEMS, 1, sel);
					SendMessage( hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L); 
					SendMessage( hwndSelCapDrvDlg, WM_CLOSE, 0, 0);
					SendMessage( hwndVideo, WM_CAP_DRIVER_GET_CAPS,
								 sizeof(CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);
					capPreviewRate( hwndVideo, 66 );
					capPreview( hwndVideo, TRUE );
			}
			return TRUE;
		case WM_CLOSE:
			DestroyWindow(hwndSelCapDrvDlg);
			return TRUE;
	}

	return( 0L );
}

int EnumCapDrv()
{
	char szDeviceName[80];
	char szDeviceVersion[80];
	char item[161];
	int i;

	for (i=0; i<10; i++)
	{
		if ( capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
									szDeviceVersion, sizeof(szDeviceVersion)) )
		{
				strcpy(item, szDeviceName);
				strcat(item, " ");
				strcat(item, szDeviceVersion);
				SendMessage(hwndSelCapDrvDlg_LBox, LB_ADDSTRING, 0, 
            			   (LPARAM) item);
            	SendMessage(hwndSelCapDrvDlg_LBox, LB_SETITEMDATA, i, (LPARAM) i);
        }
    }
    
    return 0;
}

VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt) 
{ 
    HMENU hmenu;    
    HMENU hmenuTrackPopup;
	hmenu = LoadMenu((HINSTANCE)ghInstance, "PopupMenu"); 
    if (hmenu == NULL) 
        return; 
    hmenuTrackPopup = GetSubMenu(hmenu, 0); 
    ClientToScreen(hwnd, (LPPOINT) &pt); 
    TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON, 
        pt.x, pt.y, 0, hwnd, NULL); 
    DestroyMenu(hmenu); 
}

DWORD WINAPI videoThreadProc(LPVOID lParam)
{
	SetWindowText(hwndRecord, "停止");
	capCaptureSequence(hwndVideo);
	isRecording = true;
	while (!threadEnd)
		;
	MessageBox(NULL, "Leaving Thread", "thread", NULL);
	return 0;
}
这个还是和我需要的有点差别,这个是直接预览。我是希望能够通过获取到的数据显示出来。
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
引用 2 楼 yfqvip 的回复:
单看这个图像看不出来,代码发我看看
我怎么将代码发给你呢?我用的是vs2008.
Ginie 2013-05-23
  • 打赏
  • 举报
回复
有点看不懂lz的意思,这里有一个简单的win32用VFW预览和录像的代码,lz可以参考下

#include <windows.h>
#include <vfw.h>
#include <commdlg.h>
#include "CapPicture.h"

LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM ); 
LRESULT WINAPI SelCapDrvProc( HWND, UINT, WPARAM, LPARAM );
int EnumCapDrv();
VOID APIENTRY HandlePopupMenu(HWND, POINT);
DWORD WINAPI videoThreadProc(LPVOID lParam);


HANDLE ghInstance;
HWND hwndMain;
HWND hwndVideo;
HWND hwndSelCapDrvDlg;
HWND hwndSelCapDrvDlg_LBox;
HWND hwndExit;
HWND hwndMin;
HWND hwndHelp;
HWND hwndRecord;
HANDLE hVideoThread;
HRGN hRegion1;
CAPDRIVERCAPS CapDrvCaps;
bool isRecordFileOpen = false;
char recordFile[260];
bool isPicFileOpen = false;
char pictureFile[260];
bool isRecording = false;
bool threadEnd = false;

int PASCAL WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,

    LPSTR lpszCmdLine,
    int nCmdShow )
{
   WNDCLASS wc;
   MSG msg;

   if( !hPrevInstance )
   {
      wc.lpszClassName = "GenericAppClass";
      wc.lpfnWndProc = MainWndProc;
      wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
      wc.hInstance = hInstance;
      wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      wc.hCursor = LoadCursor( NULL, IDC_ARROW );
      wc.hbrBackground = CreateSolidBrush (RGB(196, 200, 204));
      wc.lpszMenuName = "GenericAppMenu";

      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;

      RegisterClass( &wc );
   }

   ghInstance = hInstance;

   hwndMain = CreateWindow( "GenericAppClass",
      "Super Video",
      WS_POPUP,
      100,
      100,
      500,
      500,
      NULL,
      NULL,
      hInstance,
      NULL
   );

   ShowWindow( hwndMain, nCmdShow );
   SetWindowRgn(hwndMain,hRegion1,1);

   while( GetMessage( &msg, NULL, 0, 0 ) ) {
      TranslateMessage( &msg );

      DispatchMessage( &msg );
   }

   return msg.wParam;
}

LRESULT CALLBACK MainWndProc( HWND hwndMain, UINT msg, WPARAM wParam,
   LPARAM lParam )
{
   HDC hDC = GetDC(hwndMain);
   RECT rc;           
   POINT pt;  

   switch( msg ) {
	  case WM_LBUTTONDBLCLK:
	  	    SetFocus(hwndMain);
	  	    break;
      case WM_RBUTTONDOWN: 
            GetClientRect(hwndMain, (LPRECT) &rc); 
            pt.x = LOWORD(lParam); 
            pt.y = HIWORD(lParam); 
            if (PtInRect((LPRECT) &rc, pt)) 
                HandlePopupMenu(hwndMain, pt); 
            break; 
      case WM_PAINT:
         FrameRgn(hDC,hRegion1,CreateSolidBrush(RGB(0,0,0)),2,2); 
  		 BringWindowToTop(hwndSelCapDrvDlg);
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));
	  case WM_COMMAND:
	  	 CAPSTATUS CapStatus;
	  	 switch( wParam ) {
 		
		 	case SOURCE:
	  	 	   if(CapDrvCaps.fHasDlgVideoSource)
	  	 	   		capDlgVideoSource(hwndVideo);
	  	 	   break;
	  	 	case FORMAT:
	  	 	   if(CapDrvCaps.fHasDlgVideoFormat)
	  	 	   {		
	  	 	   		capDlgVideoFormat(hwndMain);
	  	 	   		capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
	  	 	   		SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
	  	 	   					CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
	  	 	   }
	  	 	   break;
	  	 	case DISPLAY:
	  	 		if (CapDrvCaps.fHasDlgVideoDisplay)
	  	 			capDlgVideoDisplay(hwndVideo);
	  	 		break;
            case EXIT:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
               break;
            case MINIMIZE:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
               break;
            case HELP:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
               break;
            case RECORDVIDEO:
            if(HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndRecord)
            {
			   if (!isRecordFileOpen)
			   {
			   		OPENFILENAME ofn;
			   		ZeroMemory(&ofn, sizeof(OPENFILENAME));
					ofn.lStructSize = sizeof(OPENFILENAME);
					ofn.hwndOwner = hwndMain;
					ofn.lpstrFile = recordFile;
					ofn.nMaxFile = sizeof(recordFile);
					ofn.lpstrFilter = "Video\0*.avi";
					ofn.nFilterIndex = 1;
					ofn.lpstrFileTitle = NULL;
					ofn.nMaxFileTitle = 0;
					ofn.lpstrInitialDir = NULL;
					ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
					if(GetSaveFileName(&ofn) == TRUE)
					{
						strcpy(recordFile, ofn.lpstrFile);
						strcat(recordFile, ".avi");
						isRecordFileOpen = true; 
						DWORD id;
						SECURITY_ATTRIBUTES sa;
						sa.nLength = sizeof(SECURITY_ATTRIBUTES);
						sa.lpSecurityDescriptor = NULL;
						sa.bInheritHandle = TRUE;
						hVideoThread = CreateThread(&sa, (ULONG)0, 
											videoThreadProc, (LPVOID)(ULONG)0, (ULONG)0, &id);		
						if(hVideoThread == NULL)
							MessageBox(NULL, "Creation of Record Thread failed!", "Thread", MB_OK | MB_ICONEXCLAMATION);
						
						break;
					}
				}

				if (isRecordFileOpen) 
				{
					if(isRecording)
					{
						threadEnd = true;
						capFileSaveAs(hwndVideo, recordFile);
						SetWindowText(hwndRecord, "Record Video");
						isRecording = false;
						break;
					}
					
					if(!isRecording )
					{
						int a = 0;
						
						MessageBox(hwndMain, "Do you want to write over the open file?",
									"File warning", MB_YESNO | MB_ICONWARNING);
						if (a != IDYES)
						{
							isRecordFileOpen = false;
							SendMessage(hwndMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM) hwndRecord);
						}
						
						if (a == IDYES)
						{
							capCaptureSequence(hwndVideo);
							isRecording = true;
						}
						
					break;
					}
				}
			}	
         	break;
         }
      break;
     case WM_CREATE:
      
      	RECT helpRect, minRect, exitRect;
      	HRGN helpRgn, minRgn, exitRgn;
        hRegion1 = CreateRoundRectRgn(100,100,500, 500,20,20);   
	  	hwndVideo = capCreateCaptureWindow(
	  					(LPSTR) "My Capture Window",
	  					WS_CHILD | WS_VISIBLE,
	  					150, 150, 300, 280,
	  					(HWND) hwndMain,
	  					(int) 1);
		hwndExit = CreateWindow (
				"button",
				"x",
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
				470, 110, BUTTONSIZE, BUTTONSIZE,
				hwndMain,
				(HMENU) EXIT,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);
		hwndMin = CreateWindow (
				"button",
				"-",
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
				450, 110, BUTTONSIZE, BUTTONSIZE,
				hwndMain,
				(HMENU) MINIMIZE,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);  		
		hwndHelp = CreateWindow (
				"button",
				"?",
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
				430, 110, BUTTONSIZE, BUTTONSIZE, 
				hwndMain, 
				(HMENU) HELP,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);
		hwndRecord = CreateWindow (
				"button", 
				"录像", 
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER, 
				250, 464, 90, 28,
				hwndMain, 
				(HMENU) RECORDVIDEO,
				(HINSTANCE)ghInstance,
				(LPVOID)NULL);				
				
	  	GetClientRect(hwndHelp, &helpRect);
	  	GetClientRect(hwndMin, &minRect);
	  	GetClientRect(hwndExit, &exitRect);
	  		  		  	
	  	helpRgn = CreateEllipticRgnIndirect(&helpRect);
		minRgn = CreateEllipticRgnIndirect(&minRect);
		exitRgn = CreateEllipticRgnIndirect(&exitRect);
	  		  		
	    SetWindowRgn(hwndExit,exitRgn,1);
	    SetWindowRgn(hwndMin,minRgn,1);					  		  		
	    SetWindowRgn(hwndHelp,helpRgn,1);				
	
		hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance, 
										MAKEINTRESOURCE( SELCAPDRVDLG  ), 
										0, (DLGPROC)SelCapDrvProc);
		hwndSelCapDrvDlg_LBox = GetDlgItem(hwndSelCapDrvDlg, 
   										   SELCAPDRVDLG_LSTBOX);
	    EnumCapDrv();
      break;
      case WM_DESTROY:
      	 capPreview(hwndVideo, FALSE);
      	 capDriverDisconnect(hwndVideo);
         PostQuitMessage( 0 );
         break;
      default:
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));

   }

   return 0;
}

LRESULT CALLBACK SelCapDrvProc( HWND hWnd, UINT msg, 
								WPARAM wParam, LPARAM lParam )
{

	switch(msg)
	{
		case WM_INITDIALOG:
		    return TRUE;
		case WM_COMMAND:
			switch ( wParam )
			{
				case SELCAPDRVDLG_BUTTON:
					int sel = 0;
					SendMessage( hwndSelCapDrvDlg_LBox, LB_GETSELITEMS, 1, sel);
					SendMessage( hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L); 
					SendMessage( hwndSelCapDrvDlg, WM_CLOSE, 0, 0);
					SendMessage( hwndVideo, WM_CAP_DRIVER_GET_CAPS,
								 sizeof(CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);
					capPreviewRate( hwndVideo, 66 );
					capPreview( hwndVideo, TRUE );
			}
			return TRUE;
		case WM_CLOSE:
			DestroyWindow(hwndSelCapDrvDlg);
			return TRUE;
	}

	return( 0L );
}

int EnumCapDrv()
{
	char szDeviceName[80];
	char szDeviceVersion[80];
	char item[161];
	int i;

	for (i=0; i<10; i++)
	{
		if ( capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
									szDeviceVersion, sizeof(szDeviceVersion)) )
		{
				strcpy(item, szDeviceName);
				strcat(item, " ");
				strcat(item, szDeviceVersion);
				SendMessage(hwndSelCapDrvDlg_LBox, LB_ADDSTRING, 0, 
            			   (LPARAM) item);
            	SendMessage(hwndSelCapDrvDlg_LBox, LB_SETITEMDATA, i, (LPARAM) i);
        }
    }
    
    return 0;
}

VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt) 
{ 
    HMENU hmenu;    
    HMENU hmenuTrackPopup;
	hmenu = LoadMenu((HINSTANCE)ghInstance, "PopupMenu"); 
    if (hmenu == NULL) 
        return; 
    hmenuTrackPopup = GetSubMenu(hmenu, 0); 
    ClientToScreen(hwnd, (LPPOINT) &pt); 
    TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON, 
        pt.x, pt.y, 0, hwnd, NULL); 
    DestroyMenu(hmenu); 
}

DWORD WINAPI videoThreadProc(LPVOID lParam)
{
	SetWindowText(hwndRecord, "停止");
	capCaptureSequence(hwndVideo);
	isRecording = true;
	while (!threadEnd)
		;
	MessageBox(NULL, "Leaving Thread", "thread", NULL);
	return 0;
}
满衣兄 2013-05-23
  • 打赏
  • 举报
回复
单看这个图像看不出来,代码发我看看
hs205118hs205118 2013-05-23
  • 打赏
  • 举报
回复
自己顶一顶。求大神帮下啊。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧