win32 攝像頭捕獲系統vfw


[html]  view plain copy
 
  1. //win32 攝像頭捕獲系統vfw  
[html]  view plain copy
 
  1. //  VideoRecord.h  
  2. ///  用於定義一些資源ID  
[html]  view plain copy
 
  1. #include "resource.h"  
  2.   
  3. //#define EXIT  104  
  4. #define HELP  105  
  5. #define MINIMIZE 106  
  6. //#define DISPLAY  107  
  7. #define BUTTONSIZE  15  
  8. #define PHOTO   108  
  9. #define RECORDVIDEO 109  
  10. // #define RESOURCE 110  
  11. // #define FORMAT   111  
  12. #define CONNECT 112  
  13.    
[html]  view plain copy
 
  1.   
[html]  view plain copy
 
  1.   
[html]  view plain copy
 
  1.   

 

[cpp]  view plain copy
 
  1. #include <Windows.h>  
  2. #include <STRING>  
  3. #include <vfw.h>  
  4. #include "VideoRecord.h"  
  5.   
  6. #pragma comment(lib, "vfw32.lib")  
  7.   
  8. LRESULT WINAPI MainWndProc( HWNDUINTWPARAMLPARAM );  
  9. LRESULT WINAPI SelCapDrcProc( HWNDUINTWPARAMLPARAM );  
  10. int EnumCapDrv();  
  11. VOID APIENTRY HandlePopupMenu(HWND, POINT);  // 右鍵彈出菜單回調函數  
  12. WORD WINAPI VideoThreadProc( LPVOID lParam); // 視頻捕捉線程函數  
  13.   
  14. ////////////////全局變量  
  15.   
  16. HANDLE ghInstance;  // 應用程序實例  
  17. HWND hwndMain;  // 主窗口句柄  
  18. HWND hwndVideo;  // 視頻捕捉窗口句柄  
  19. HWND hwndSelCapDrvDlg; // 選擇捕捉驅動對話框句柄  
  20. HWND hwndSelCapDrvLBox; // 選擇驅動對話框列舉驅動名稱列表框句柄  
  21. HWND hwndExit;  
  22. HWND hwndMin;  
  23. HWND hwndHelp;  
  24. HWND hwndPhoto;  
  25. HWND hwndRecord;  
  26. HWND hwndBtnExit;  
  27. HWND hwndSource;  
  28. HWND hwndFormat;  
  29. HWND hwndConnect;  
  30. HANDLE hVideoTread; // 視頻采集線程  
  31. HRGN hRoundRgn; // 窗口修正區域  
  32. CAPDRIVERCAPS capDrvCaps; // 驅動性能  
  33. bool bRecordFileOpen = false;  // 錄像開始標志  
  34. bool bPhotoFileOpen = false;  // 照相開始標志  
  35. bool bRecording = false;  // 判斷是否正在錄像  
  36. bool bThreadEnd = false// 判斷視頻線程是否終止  
  37. char recordFile[260]; //保持錄像標志  
  38. char photoFile[260]; // 保持照相標志  
  39. char gachBuffer[260]; // 保存錯誤信息  
  40.   
  41. //////////////////////////////////////////////////////////////////////////////  
  42. // ErrorCallbackProc:    錯誤回調函數,過capSetCallbackOnError宏來注冊回調   
  43. // hWnd:              捕獲窗口句柄   
  44. // nErrID:              錯誤代碼   
  45. // lpErrorText:          關於錯誤的文本信息   
  46. ///////////////////////////////////////////////////////////////////////////////   
  47. LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)  
  48. {  
  49.     if(!hwndMain)  
  50.         return FALSE;  
  51.     if(nErrID==0)  
  52.         return TRUE;//清除舊的錯誤  
  53.     wsprintf(gachBuffer,"Error# %d",nErrID);//顯示錯誤標識和文本  
  54.     MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);   
  55.     return (LRESULT) TRUE;  
  56. }  
  57.   
  58. /////////////////////////////////////  
  59. int PASCAL WinMain( IN HINSTANCE hInstance,   
  60.                    IN HINSTANCE hPrevInstance,   
  61.                    IN LPSTR lpCmdLine,   
  62.                    IN int nShowCmd )  
  63. {  
  64.     WNDCLASS wndClass;  
  65.     MSG msg;  
  66.     char className[] = "VideoClass";  
  67.     // 如果不是前實例  
  68.     if (!hPrevInstance)  
  69.     {  
  70.         wndClass.lpszClassName = className;  
  71.         wndClass.lpfnWndProc = MainWndProc;  
  72.         wndClass.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;  
  73.         wndClass.hInstance = hInstance;  
  74.         wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);  
  75.         wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);  
  76.         wndClass.hbrBackground = CreateSolidBrush( RGB(200,200,100) );  
  77.         wndClass.lpszMenuName = NULL;  
  78.         wndClass.cbClsExtra = 0;  
  79.         wndClass.cbWndExtra = 0;  
  80.         RegisterClass( &wndClass );  
  81.     }  
  82.     ghInstance = hInstance;  
  83.     // 創建主窗口  
  84.     hwndMain = CreateWindow(className,  
  85.         "視頻監控系統",  
  86.         WS_POPUP|WS_OVERLAPPED,  
  87.         GetSystemMetrics(SM_CXFULLSCREEN)/2 - 600/2,  
  88.         GetSystemMetrics(SM_CYFULLSCREEN)/2-600/2,  
  89.         600, 600,  
  90.         NULL,  
  91.         NULL,  
  92.         hInstance,  
  93.         NULL);  
  94.   
  95.     ShowWindow(hwndMain, nShowCmd);  
  96.   
  97.     // 設定主窗口主要區域  
  98.     SetWindowRgn(hwndMain, hRoundRgn, 1);  
  99.       
  100.     while( GetMessage(&msg, NULL, 0, 0))  
  101.     {  
  102.         TranslateMessage(&msg);//該函數將虛擬鍵消息轉換為字符消息。  
  103.         //字符消息被寄送到調用線程的消息隊列里,當下一次線程調用函數GetMessage或PeekMessage時被讀出  
  104.         DispatchMessage(&msg);//該函數調度一個消息給窗口程序。  
  105.         //通常調度從GetMessage取得的消息。消息被調度到的窗口程序即是MainProc()函數  
  106.     }  
  107.     return msg.wParam;  
  108. }  
  109.   
  110. LRESULT CALLBACK MainWndProc( HWND hMain, UINT msg, WPARAM wParam, LPARAM lParam )  
  111. {  
  112.     HDC hdc = GetDC(hMain);  
  113.     RECT rc;   // 客戶區  
  114.     POINT pt;  // 鼠標位置  
  115.     HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);  
  116.     switch(msg)  
  117.     {  
  118.     case WM_LBUTTONDBLCLK:  
  119.         SetFocus(hMain);  
  120.         break;  
  121.     case WM_RBUTTONDOWN:  
  122.         GetClientRect(hMain, (LPRECT)&rc);  
  123.         pt.y = HIWORD(lParam);  
  124.         pt.x = LOWORD(lParam);  
  125.         if ( PtInRect(&rc, pt) )  
  126.         {  
  127.             HandlePopupMenu(hMain, pt);  
  128.         }  
  129.         break;  
  130.     case WM_PAINT:  
  131.         RECT helpRect, minRect, exitRect;  
  132.         HRGN helpRgn, minRgn, exitRgn;  
  133.         FrameRgn(hdc, hRoundRgn, CreateSolidBrush(RGB(0,0,0)), 2, 2);  
  134.         BringWindowToTop(hwndSelCapDrvDlg);  
  135.         return DefWindowProc(hMain, msg, wParam, lParam);  
  136.     case WM_CREATE:  
  137.         // 注冊錯誤提示回調函數  
  138.         capSetCallbackOnError(hwndVideo, (FARPROC)ErrorCallbackProc);  
  139.         // 主窗口主要圓角矩形區域  
  140.         hRoundRgn = CreateRoundRectRgn(100, 70, 500, 460, 20, 20);  
  141.         // 捕捉視頻區域s  
  142.         hwndVideo = capCreateCaptureWindow((LPSTR)"My Capture Window",  
  143.             WS_CHILD|WS_VISIBLE,  
  144.             140, 100, 320, 280,  
  145.             (HWND)hMain,  
  146.             (int)1);  
  147.         hwndExit = CreateWindow("button",    // 建立一個按鈕,更多如BUTTON,COMBOBOX,LISTBOX  
  148.             "x",    // button text  
  149.             WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,  
  150.             470, 75, BUTTONSIZE, BUTTONSIZE,  
  151.             hMain,  
  152.             (HMENU)EXIT,  
  153.             (HINSTANCE)ghInstance,  
  154.             (LPVOID)NULL );  
  155.         hwndMin = CreateWindow("button",    // 建立一個按鈕,更多如BUTTON,COMBOBOX,LISTBOX  
  156.             "-",    // button text  
  157.             WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,  
  158.             450, 75, BUTTONSIZE, BUTTONSIZE,  
  159.             hMain,  
  160.             (HMENU)MINIMIZE,  
  161.             (HINSTANCE)ghInstance,  
  162.             (LPVOID)NULL );  
  163.         hwndHelp = CreateWindow("button",    // 建立一個按鈕,更多如BUTTON,COMBOBOX,LISTBOX  
  164.             "?",    // button text  
  165.             WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON/*|BS_CENTER|BS_VCENTER*/,  
  166.             430, 75, BUTTONSIZE, BUTTONSIZE,  
  167.             hMain,  
  168.             (HMENU)HELP,  
  169.             (HINSTANCE)ghInstance,  
  170.             (LPVOID)NULL );  
  171.         hwndPhoto = CreateWindow("button",  
  172.             "照 相",  
  173.             WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,  
  174.             150, 410, 50, 20,  
  175.             hMain,  
  176.             (HMENU)PHOTO,  
  177.             (HINSTANCE)ghInstance,  
  178.             (LPVOID)NULL );  
  179.         SendMessage(hwndPhoto, WM_SETFONT, (WPARAM)hFont, 1);  // 設置按鈕字體為系統默認字體  
  180.         hwndRecord = CreateWindow("button",  
  181.             "錄 像",  
  182.             WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_VCENTER|BS_CENTER,  
  183.             220, 410, 50, 20,  
  184.             hMain,  
  185.             (HMENU)RECORDVIDEO,  
  186.             (HINSTANCE)ghInstance,  
  187.             (LPVOID)NULL );  
  188.         SendMessage(hwndRecord, WM_SETFONT, (WPARAM)hFont, 1);// 設置按鈕字體為系統默認字體  
  189.         hwndBtnExit = CreateWindow("button",   // 退出按鈕  
  190.             "退 出",  
  191.             WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_VCENTER|BS_CENTER,  
  192.             400, 410, 50, 20,  
  193.             hMain,  
  194.             (HMENU)EXIT,  
  195.             (HINSTANCE)ghInstance,  
  196.             (LPVOID)NULL );  
  197.         SendMessage(hwndBtnExit, WM_SETFONT, (WPARAM)hFont, 1);  
  198.         // 設置按鈕區域  
  199.         GetClientRect(hwndHelp, &helpRect);  
  200.         GetClientRect(hwndMin, &minRect);  
  201.         GetClientRect(hwndExit, &exitRect);  
  202.           
  203.         helpRgn = CreateEllipticRgnIndirect(&helpRect);  
  204.         minRgn = CreateEllipticRgnIndirect(&minRect);  
  205.         exitRgn = CreateEllipticRgnIndirect(&exitRect);  
  206.           
  207.         SetWindowRgn(hwndExit,exitRgn,1);  
  208.         SetWindowRgn(hwndMin,minRgn,1);                               
  209.         SetWindowRgn(hwndHelp,helpRgn,1);  
  210.   
  211.         // 創建選擇驅動對話框  
  212.         hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance,  
  213.             MAKEINTRESOURCE(DLG_SELCAPDRIVER),  
  214.             0, (DLGPROC)SelCapDrcProc);  
  215.         hwndSelCapDrvLBox = GetDlgItem(hwndSelCapDrvDlg, LISTBOX_SELCAPDRIVER);  
  216.           
  217.         EnumCapDrv();  
  218.         break;  
  219.     case WM_COMMAND:  
  220.         CAPSTATUS capStatus;  
  221.         switch(wParam)  
  222.         {  
  223.         case EXIT:  // 退出系統  
  224.             SendMessage(hMain, WM_SYSCOMMAND, SC_CLOSE, 0);  
  225.             break;  
  226.         case MINIMIZE: // 最小化  
  227.             SendMessage(hMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);  
  228.             break;  
  229.         case HELP:  // 幫助按鈕  
  230.             SendMessage(hMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);  
  231.             break;  
  232.         case RESOURCE: // 視頻源選項  
  233.             if (capDrvCaps.fHasDlgVideoSource)  
  234.             {  
  235.                 capDlgVideoSource(hwndVideo);  
  236.             }  
  237.             break;  
  238.         case FORMAT:  // 視頻格式選項  
  239.             if (capDrvCaps.fHasDlgVideoFormat)  
  240.             {  
  241.                 capDlgVideoFormat(hwndVideo);  
  242.             }  
  243.             break;  
  244.         case CONNECT:  
  245.             break;  
  246.         case DISPLAY: // 視頻顯示選項  
  247.             if (capDrvCaps.fHasDlgVideoDisplay)  
  248.             {  
  249.                 capDlgVideoDisplay(hMain);  
  250.                 capGetStatus(hwndVideo, &capStatus, sizeof(CAPSTATUS));// 得到當前捕獲窗口的狀態  
  251.                 SetWindowPos(hwndVideo, NULL, 0, 0, capStatus.uiImageWidth, capStatus.uiImageHeight, SWP_NOZORDER|SWP_NOMOVE);  
  252.             }  
  253.             break;  
  254.         case PHOTO:  // 抓取圖片  
  255.             if ( capFileSaveDIB(hwndVideo, "test.bmp") ){  
  256.                 MessageBox(hMain, "Save Bmp File Succeeded!""photo save", MB_OK|MB_ICONINFORMATION);  
  257.             }  
  258.             else break;  
  259.             if (!bPhotoFileOpen)  
  260.             {  
  261.                 OPENFILENAME ofnp;  // open file name structure  
  262.                 ZeroMemory(&ofnp, sizeof(OPENFILENAME));  
  263.                 ofnp.lStructSize = sizeof(OPENFILENAME);  
  264.                 ofnp.hwndOwner = hMain;  
  265.                 ofnp.lpstrFile = photoFile;  
  266.                 ofnp.lpstrFilter = "*.bmp";  
  267.                 ofnp.nMaxFile = sizeof(photoFile);  
  268.                 ofnp.nFilterIndex = 1;  
  269.                 ofnp.nMaxFileTitle = 0;  
  270.                 ofnp.lpstrInitialDir = NULL;  
  271.                 ofnp.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;  
  272.                 // 顯示保存文件對話框  
  273.                 if (GetSaveFileName(&ofnp) == TRUE)  
  274.                 {  
  275.                     bPhotoFileOpen = TRUE;  
  276.                     strcpy(photoFile, ofnp.lpstrFile);  
  277.                     strcat(photoFile, ".bmp");  
  278.                     capDriverConnect(hwndPhoto, 0);  // 與驅動連接  
  279.                     capOverlay(hwndPhoto, TRUE); // //使用 hardware overlay   
  280.                     //使 video input directlyinto framebuffer,使不用 CPU  
  281.                     capPreview(hwndVideo, TRUE);  // 抓取圖像顯示在視窗  
  282.                     capPreviewScale(hwndVideo, TRUE); // 使圖像延伸到所設定的視窗大小  
  283.                     capPreviewRate(hwndVideo, 1000/30); // 每秒圖像變化張數  
  284.                     capPreview(hwndVideo, TRUE); // 預覽圖像顯示  
  285.                     capGrabFrameNoStop(hwndVideo);  
  286.                     capEditCopy(hwndVideo);  
  287.                     if (capFileSaveDIB(hwndVideo, photoFile)){  
  288.                         MessageBox(hMain, "Save Bmp File Succeeded!""photo save", MB_OK|MB_ICONINFORMATION);  
  289.                     }  
  290.                     break;  
  291.                 }  
  292.             }  
  293.             break;  
  294.         case RECORDVIDEO:  // 錄制視頻  
  295.             if (HIWORD(wParam) == BN_CLICKED && (HWND)lParam == hwndRecord)  
  296.             {  
  297.                 OPENFILENAME ofnp;  
  298.                 if (!bRecordFileOpen)  
  299.                 {  
  300.                     ZeroMemory(&ofnp, sizeof(OPENFILENAME));  
  301.                     ofnp.lStructSize = sizeof(OPENFILENAME);  
  302.                     ofnp.nMaxFile = sizeof(recordFile);  
  303.                     ofnp.hwndOwner = hMain;  
  304.                     ofnp.lpstrFile = recordFile;  
  305.                     ofnp.lpstrFilter = "*.avi";  
  306.                     ofnp.lpstrInitialDir = NULL;  
  307.                     ofnp.nFilterIndex = 1;  
  308.                     ofnp.lpstrFileTitle = NULL;  
  309.                     ofnp.nMaxFileTitle = 0;  
  310.                     ofnp.Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;  
  311.                     // 顯示保存文件對話框  
  312.                     if (GetSaveFileName(&ofnp) == TRUE)  
  313.                     {  
  314.                         strcpy(recordFile, ofnp.lpstrFile);  
  315.                         strcat(recordFile, ".avi");  
  316.                         bRecordFileOpen = TRUE;  
  317.                         // 創建視頻采集線程  
  318.                         DWORD id;  
  319.                         SECURITY_ATTRIBUTES sa;  
  320.                         sa.nLength = sizeof(SECURITY_ATTRIBUTES);  
  321.                         sa.lpSecurityDescriptor = NULL;  
  322.                         sa.bInheritHandle = TRUE;  
  323.                         hVideoTread = CreateThread(&sa,  
  324.                             (ULONG)0,  
  325.                             (LPTHREAD_START_ROUTINE)VideoThreadProc,  
  326.                             (LPVOID)(ULONG)0,  
  327.                             0,  
  328.                             &id);  
  329.                         // 如果創建線程失敗,彈出提示對話框  
  330.                         if (hVideoTread == NULL)  
  331.                         {  
  332.                             MessageBox(NULL, "Video Thread Create Failure!""Thread", MB_OK|MB_ICONINFORMATION);     
  333.                         }  
  334.                     }  
  335.                     break;  
  336.                 }  
  337.                 if (bRecordFileOpen)  // 已經打開一個選擇對話框  
  338.                 {  
  339.                     if (bRecording)  // 已經在錄制視頻中  
  340.                     {  
  341.                         bThreadEnd = true;  
  342.                         // 結束錄制,並保存  
  343.                         if ( capFileSaveAs(hwndVideo, recordFile) ){  
  344.                             MessageBox(NULL, "Save Avi File Succeeded!""RecordVideo", MB_OK|MB_ICONINFORMATION);  
  345.                         }  
  346.                         SetWindowText(hwndRecord, "錄 像");  
  347.                         bRecording = false;  
  348.                         break;  
  349.                     }  
  350.                     else  // 沒有錄像但是選擇了一個文件  
  351.                     {  
  352.                         int rt = 0;  
  353.                         rt = MessageBox(hMain, "Do you want write over that file?""系統提示", MB_YESNO|MB_ICONINFORMATION);  
  354.                         if (rt == IDYES)  // 繼續錄制,覆蓋當前文件  
  355.                         {     
  356.                             if (capCaptureSequence(hwndRecord))  
  357.                             {  
  358.                                 bRecording = true;  
  359.                                 SetWindowText(hwndRecord, "停 止");  
  360.                             }     
  361.                         }  
  362.                         else  
  363.                         {  
  364.                             bRecordFileOpen = false;  
  365.                             SendMessage(hMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM)hwndRecord);  
  366.                         }  
  367.                         break;  
  368.                     }  
  369.                     break;  
  370.                 }     
  371.             }  
  372.         }  
  373.         break;  
  374.     case WM_DESTROY:  
  375.         capSetCallbackOnError(hwndVideo, NULL);  
  376.         capPreview(hwndVideo, FALSE); // 停止預覽  
  377.         capCaptureAbort(hwndVideo);  // 停止捕獲  
  378.         capDriverDisconnect(hwndVideo); // 斷開驅動連接  
  379.         PostQuitMessage(0);  
  380.         break;  
  381.     default:  
  382.         return DefWindowProc(hMain, msg, wParam, lParam);  
  383.     }  
  384.     return 0;  
  385. }  
  386.   
  387. LRESULT WINAPI SelCapDrcProc( HWND hMian, UINT msg, WPARAM wParam, LPARAM lParam )  
  388. {  
  389. //  ShowWindow(hwndSelCapDrvDlg, SW_SHOW);  
  390.     switch(msg)  
  391.     {  
  392.     case WM_INITDIALOG:  
  393.         return TRUE;  
  394.     case WM_COMMAND:  
  395.         switch(wParam)  
  396.         {  
  397.         case BTN_SEL:  
  398.             int sel = 0;  
  399.             SendMessage(hwndSelCapDrvLBox, LB_GETSELITEMS, 1, sel );  // 獲取選擇的驅動  
  400.             SendMessage(hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L);   // 連接驅動  
  401.             SendMessage(hwndSelCapDrvDlg, WM_CLOSE, 0, 0);   // 關閉對話框  
  402.             SendMessage(hwndVideo, WM_CAP_DRIVER_GET_CAPS, sizeof(CAPDRIVERCAPS), (long)(LPVOID)&capDrvCaps); // 更新驅動的能力  
  403.             if (capDrvCaps.fHasOverlay)  
  404.             {  
  405.                 capOverlay(hwndVideo, TRUE);  
  406.             }  
  407.             capPreviewRate(hwndVideo, 66);   //設置視頻捕獲速率提高到66 miliseconds  
  408.             if ( !capPreview(hwndVideo, TRUE))   //用CapPreview啟動預覽功能  
  409.             {  
  410.                 MessageBox(NULL, "預覽啟動失敗""提示", MB_OK|MB_ICONINFORMATION);  
  411.                 SendMessage(hMian, WM_COMMAND, EXIT, 0);  
  412.                 return FALSE;  
  413.   
  414.             }  
  415.         }  
  416.         return TRUE;  
  417.     case WM_CLOSE:  
  418.         DestroyWindow(hwndSelCapDrvDlg);  
  419.         return TRUE;  
  420.     }  
  421.     return (0L);  
  422. }  
  423.   
  424. int EnumCapDrv()  
  425. {  
  426.     char drvName[100];  
  427.     char drvVesion[100];  
  428.     char drvStr[200];  
  429.     for (int i = 0; i < 5; i++)  // 掃面獲取驅動信息  
  430.     {  
  431.         if ( capGetDriverDescription(i, drvName, sizeof(drvName), drvVesion, sizeof(drvVesion)) )  
  432.         {  
  433.             strcpy(drvStr, drvName);  
  434.             strcat(drvStr, "  ");  
  435.             strcat(drvStr, drvVesion);  
  436.             SendMessage(hwndSelCapDrvLBox, LB_ADDSTRING, 0, (LPARAM)drvStr); // 向列表框增加字符串  
  437.             SendMessage(hwndSelCapDrvLBox, LB_SETITEMDATA, i, (LPARAM)i);  
  438.         }  
  439.     }  
  440.     return 0;  
  441. }  
  442.   
  443. VOID APIENTRY HandlePopupMenu( HWND hwnd, POINT pt )  
  444. {  
  445.     HMENU hmenu;  
  446.     HMENU hPopupMenu;  
  447.     hmenu = LoadMenu((HINSTANCE)ghInstance, MAKEINTRESOURCE(IDR_POPUPMENU));  
  448.     if(hmenu == NULL) return;  
  449.     // 獲取子菜單  
  450.     hPopupMenu = GetSubMenu(hmenu, 0);  
  451.     // 彈出菜單使用屏幕坐標,所以轉換鼠標點擊坐標到屏幕坐標  
  452.     ClientToScreen(hwnd, &pt);  
  453.     TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hwnd, NULL);  
  454.     DestroyMenu(hmenu); // 銷毀指定菜單,並釋放此菜單占用的內存  
  455. }  
  456.   
  457. WORD WINAPI VideoThreadProc( LPVOID lParam )  
  458. {  
  459.     // 捕獲視頻  
  460.     if( capCaptureSequence(hwndVideo) ) //該函數調控啟動流視頻和音頻捕獲到一個文件,你能使用這個功能發送消息  
  461.     {  
  462.         SetWindowText(hwndRecord, "停 止");  
  463.         MessageBox(NULL, "Start to capture video.""提示", MB_OK|MB_ICONINFORMATION);  
  464.         bRecording = true;  
  465.     }  
  466.     while(!bThreadEnd);  
  467.     MessageBox(NULL, "Leaving Record Thread""Thread",NULL);  
  468.     return 0;  
  469. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM