CapPicture.CPP
上传用户:loganwang
上传日期:2013-05-18
资源大小:21k
文件大小:10k
源码类别:

视频捕捉/采集

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <vfw.h>
  3. #include <commdlg.h>
  4. #include "CapPicture.h"
  5. LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM ); 
  6. LRESULT WINAPI SelCapDrvProc( HWND, UINT, WPARAM, LPARAM );
  7. int EnumCapDrv();
  8. VOID APIENTRY HandlePopupMenu(HWND, POINT);
  9. DWORD WINAPI videoThreadProc(LPVOID lParam);
  10. HANDLE ghInstance;
  11. HWND hwndMain;
  12. HWND hwndVideo;
  13. HWND hwndSelCapDrvDlg;
  14. HWND hwndSelCapDrvDlg_LBox;
  15. HWND hwndExit;
  16. HWND hwndMin;
  17. HWND hwndHelp;
  18. HWND hwndRecord;
  19. HANDLE hVideoThread;
  20. HRGN hRegion1;
  21. CAPDRIVERCAPS CapDrvCaps;
  22. bool isRecordFileOpen = false;
  23. char recordFile[260];
  24. bool isPicFileOpen = false;
  25. char pictureFile[260];
  26. bool isRecording = false;
  27. bool threadEnd = false;
  28. int PASCAL WinMain( HINSTANCE hInstance,
  29.     HINSTANCE hPrevInstance,
  30.     LPSTR lpszCmdLine,
  31.     int nCmdShow )
  32. {
  33.    WNDCLASS wc;
  34.    MSG msg;
  35.    if( !hPrevInstance )
  36.    {
  37.       wc.lpszClassName = "GenericAppClass";
  38.       wc.lpfnWndProc = MainWndProc;
  39.       wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
  40.       wc.hInstance = hInstance;
  41.       wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
  42.       wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  43.       wc.hbrBackground = CreateSolidBrush (RGB(196, 200, 204));
  44.       wc.lpszMenuName = "GenericAppMenu";
  45.       wc.cbClsExtra = 0;
  46.       wc.cbWndExtra = 0;
  47.       RegisterClass( &wc );
  48.    }
  49.    ghInstance = hInstance;
  50.    hwndMain = CreateWindow( "GenericAppClass",
  51.       "Super Video",
  52.       WS_POPUP,
  53.       100,
  54.       100,
  55.       500,
  56.       500,
  57.       NULL,
  58.       NULL,
  59.       hInstance,
  60.       NULL
  61.    );
  62.    ShowWindow( hwndMain, nCmdShow );
  63.    SetWindowRgn(hwndMain,hRegion1,1);
  64.    while( GetMessage( &msg, NULL, 0, 0 ) ) {
  65.       TranslateMessage( &msg );
  66.       DispatchMessage( &msg );
  67.    }
  68.    return msg.wParam;
  69. }
  70. LRESULT CALLBACK MainWndProc( HWND hwndMain, UINT msg, WPARAM wParam,
  71.    LPARAM lParam )
  72. {
  73.    HDC hDC = GetDC(hwndMain);
  74.    RECT rc;           
  75.    POINT pt;  
  76.    switch( msg ) {
  77.   case WM_LBUTTONDBLCLK:
  78.        SetFocus(hwndMain);
  79.        break;
  80.       case WM_RBUTTONDOWN: 
  81.             GetClientRect(hwndMain, (LPRECT) &rc); 
  82.             pt.x = LOWORD(lParam); 
  83.             pt.y = HIWORD(lParam); 
  84.             if (PtInRect((LPRECT) &rc, pt)) 
  85.                 HandlePopupMenu(hwndMain, pt); 
  86.             break; 
  87.       case WM_PAINT:
  88.          FrameRgn(hDC,hRegion1,CreateSolidBrush(RGB(0,0,0)),2,2); 
  89.     BringWindowToTop(hwndSelCapDrvDlg);
  90.          return( DefWindowProc( hwndMain, msg, wParam, lParam ));
  91.   case WM_COMMAND:
  92.     CAPSTATUS CapStatus;
  93.     switch( wParam ) {
  94.  
  95.   case SOURCE:
  96.         if(CapDrvCaps.fHasDlgVideoSource)
  97.          capDlgVideoSource(hwndVideo);
  98.         break;
  99.      case FORMAT:
  100.         if(CapDrvCaps.fHasDlgVideoFormat)
  101.         {
  102.          capDlgVideoFormat(hwndMain);
  103.          capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
  104.          SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
  105.          CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
  106.         }
  107.         break;
  108.      case DISPLAY:
  109.      if (CapDrvCaps.fHasDlgVideoDisplay)
  110.      capDlgVideoDisplay(hwndVideo);
  111.      break;
  112.             case EXIT:
  113.                SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
  114.                break;
  115.             case MINIMIZE:
  116.                SendMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  117.                break;
  118.             case HELP:
  119.                SendMessage(hwndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
  120.                break;
  121.             case RECORDVIDEO:
  122.             if(HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndRecord)
  123.             {
  124.    if (!isRecordFileOpen)
  125.    {
  126.     OPENFILENAME ofn;
  127.     ZeroMemory(&ofn, sizeof(OPENFILENAME));
  128. ofn.lStructSize = sizeof(OPENFILENAME);
  129. ofn.hwndOwner = hwndMain;
  130. ofn.lpstrFile = recordFile;
  131. ofn.nMaxFile = sizeof(recordFile);
  132. ofn.lpstrFilter = "Video*.avi";
  133. ofn.nFilterIndex = 1;
  134. ofn.lpstrFileTitle = NULL;
  135. ofn.nMaxFileTitle = 0;
  136. ofn.lpstrInitialDir = NULL;
  137. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
  138. if(GetSaveFileName(&ofn) == TRUE)
  139. {
  140. strcpy(recordFile, ofn.lpstrFile);
  141. strcat(recordFile, ".avi");
  142. isRecordFileOpen = true; 
  143. DWORD id;
  144. SECURITY_ATTRIBUTES sa;
  145. sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  146. sa.lpSecurityDescriptor = NULL;
  147. sa.bInheritHandle = TRUE;
  148. hVideoThread = CreateThread(&sa, (ULONG)0, 
  149. videoThreadProc, (LPVOID)(ULONG)0, (ULONG)0, &id);
  150. if(hVideoThread == NULL)
  151. MessageBox(NULL, "Creation of Record Thread failed!", "Thread", MB_OK | MB_ICONEXCLAMATION);
  152. break;
  153. }
  154. }
  155. if (isRecordFileOpen) 
  156. {
  157. if(isRecording)
  158. {
  159. threadEnd = true;
  160. capFileSaveAs(hwndVideo, recordFile);
  161. SetWindowText(hwndRecord, "Record Video");
  162. isRecording = false;
  163. break;
  164. }
  165. if(!isRecording )
  166. {
  167. int a = 0;
  168. MessageBox(hwndMain, "Do you want to write over the open file?",
  169. "File warning", MB_YESNO | MB_ICONWARNING);
  170. if (a != IDYES)
  171. {
  172. isRecordFileOpen = false;
  173. SendMessage(hwndMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM) hwndRecord);
  174. }
  175. if (a == IDYES)
  176. {
  177. capCaptureSequence(hwndVideo);
  178. isRecording = true;
  179. }
  180. break;
  181. }
  182. }
  183. }
  184.           break;
  185.          }
  186.       break;
  187.      case WM_CREATE:
  188.       
  189.        RECT helpRect, minRect, exitRect;
  190.        HRGN helpRgn, minRgn, exitRgn;
  191.         hRegion1 = CreateRoundRectRgn(100,100,500, 500,20,20);   
  192.    hwndVideo = capCreateCaptureWindow(
  193.    (LPSTR) "My Capture Window",
  194.    WS_CHILD | WS_VISIBLE,
  195.    150, 150, 300, 280,
  196.    (HWND) hwndMain,
  197.    (int) 1);
  198. hwndExit = CreateWindow (
  199. "button",
  200. "x",
  201. WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
  202. 470, 110, BUTTONSIZE, BUTTONSIZE,
  203. hwndMain,
  204. (HMENU) EXIT,
  205. (HINSTANCE)ghInstance,
  206. (LPVOID)NULL);
  207. hwndMin = CreateWindow (
  208. "button",
  209. "-",
  210. WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
  211. 450, 110, BUTTONSIZE, BUTTONSIZE,
  212. hwndMain,
  213. (HMENU) MINIMIZE,
  214. (HINSTANCE)ghInstance,
  215. (LPVOID)NULL);  
  216. hwndHelp = CreateWindow (
  217. "button",
  218. "?",
  219. WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER,
  220. 430, 110, BUTTONSIZE, BUTTONSIZE, 
  221. hwndMain, 
  222. (HMENU) HELP,
  223. (HINSTANCE)ghInstance,
  224. (LPVOID)NULL);
  225. hwndRecord = CreateWindow (
  226. "button", 
  227. "录像", 
  228. WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_CENTER | BS_VCENTER, 
  229. 250, 464, 90, 28,
  230. hwndMain, 
  231. (HMENU) RECORDVIDEO,
  232. (HINSTANCE)ghInstance,
  233. (LPVOID)NULL);
  234.    GetClientRect(hwndHelp, &helpRect);
  235.    GetClientRect(hwndMin, &minRect);
  236.    GetClientRect(hwndExit, &exitRect);
  237.         
  238.    helpRgn = CreateEllipticRgnIndirect(&helpRect);
  239. minRgn = CreateEllipticRgnIndirect(&minRect);
  240. exitRgn = CreateEllipticRgnIndirect(&exitRect);
  241.      
  242.     SetWindowRgn(hwndExit,exitRgn,1);
  243.     SetWindowRgn(hwndMin,minRgn,1);      
  244.     SetWindowRgn(hwndHelp,helpRgn,1);
  245. hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance, 
  246. MAKEINTRESOURCE( SELCAPDRVDLG  ), 
  247. 0, (DLGPROC)SelCapDrvProc);
  248. hwndSelCapDrvDlg_LBox = GetDlgItem(hwndSelCapDrvDlg, 
  249.        SELCAPDRVDLG_LSTBOX);
  250.     EnumCapDrv();
  251.       break;
  252.       case WM_DESTROY:
  253.         capPreview(hwndVideo, FALSE);
  254.         capDriverDisconnect(hwndVideo);
  255.          PostQuitMessage( 0 );
  256.          break;
  257.       default:
  258.          return( DefWindowProc( hwndMain, msg, wParam, lParam ));
  259.    }
  260.    return 0;
  261. }
  262. LRESULT CALLBACK SelCapDrvProc( HWND hWnd, UINT msg, 
  263. WPARAM wParam, LPARAM lParam )
  264. {
  265. switch(msg)
  266. {
  267. case WM_INITDIALOG:
  268.     return TRUE;
  269. case WM_COMMAND:
  270. switch ( wParam )
  271. {
  272. case SELCAPDRVDLG_BUTTON:
  273. int sel = 0;
  274. SendMessage( hwndSelCapDrvDlg_LBox, LB_GETSELITEMS, 1, sel);
  275. SendMessage( hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L); 
  276. SendMessage( hwndSelCapDrvDlg, WM_CLOSE, 0, 0);
  277. SendMessage( hwndVideo, WM_CAP_DRIVER_GET_CAPS,
  278.  sizeof(CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);
  279. capPreviewRate( hwndVideo, 66 );
  280. capPreview( hwndVideo, TRUE );
  281. }
  282. return TRUE;
  283. case WM_CLOSE:
  284. DestroyWindow(hwndSelCapDrvDlg);
  285. return TRUE;
  286. }
  287. return( 0L );
  288. }
  289. int EnumCapDrv()
  290. {
  291. char szDeviceName[80];
  292. char szDeviceVersion[80];
  293. char item[161];
  294. int i;
  295. for (i=0; i<10; i++)
  296. {
  297. if ( capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
  298. szDeviceVersion, sizeof(szDeviceVersion)) )
  299. {
  300. strcpy(item, szDeviceName);
  301. strcat(item, " ");
  302. strcat(item, szDeviceVersion);
  303. SendMessage(hwndSelCapDrvDlg_LBox, LB_ADDSTRING, 0, 
  304.                 (LPARAM) item);
  305.              SendMessage(hwndSelCapDrvDlg_LBox, LB_SETITEMDATA, i, (LPARAM) i);
  306.         }
  307.     }
  308.     
  309.     return 0;
  310. }
  311. VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt) 
  312.     HMENU hmenu;    
  313.     HMENU hmenuTrackPopup;
  314. hmenu = LoadMenu((HINSTANCE)ghInstance, "PopupMenu"); 
  315.     if (hmenu == NULL) 
  316.         return; 
  317.     hmenuTrackPopup = GetSubMenu(hmenu, 0); 
  318.     ClientToScreen(hwnd, (LPPOINT) &pt); 
  319.     TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN | TPM_LEFTBUTTON, 
  320.         pt.x, pt.y, 0, hwnd, NULL); 
  321.     DestroyMenu(hmenu); 
  322. }
  323. DWORD WINAPI videoThreadProc(LPVOID lParam)
  324. {
  325. SetWindowText(hwndRecord, "停止");
  326. capCaptureSequence(hwndVideo);
  327. isRecording = true;
  328. while (!threadEnd)
  329. ;
  330. MessageBox(NULL, "Leaving Thread", "thread", NULL);
  331. return 0;
  332. }