| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
VidCaptureharja 12.07.03 23:36 Pieni esimerkki esim. web-kameran videokuvan näyttämisestä ikkunassa
/* VidCapture - pieni esimerkki VFW:n käytöstä Tällaisenaan näyttää vaan suoraan dataa kameralta, mutta Laajentaminen ei ole kovin vaikeaa */ #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <vfw.h> #define WND_ID 1024 #define IDC_DRIVERS 1024 #define IDS_TEXT1 1025 char g_szClassName[]="CaptureWndClass"; HWND hwndCapture; // Video for Windows callback /*LRESULT CALLBACK capControlCallback(HWND hWnd, int nState) { switch(nState) { case CONTROLCALLBACK_PREROLL: return true; case CONTROLCALLBACK_CAPTURE: return true; } return 0; }*/ /* Luodaan capture-ikkuna. */ int initializeCaptureWindow(HWND hwndParent) { int fOK=0; hwndCapture=capCreateCaptureWindow("CaptureWindow", WS_CHILD|WS_VISIBLE|SS_SIMPLE, 5, 5, 320, 200, hwndParent, WND_ID); if(hwndCapture==NULL) return 0; /* Lähetetään yhteyspyyntö ikkunalle, ja otetaan paluuarvo talteen */ fOK=SendMessage(hwndCapture, WM_CAP_DRIVER_CONNECT, 0, 0L); if(!fOK) return 0; return 1; } /* Luodaan muut kontrollit. Näillä ei tehdä mitään tällä hetkellä, mutta omat toiminnallisuudet voi tehdä helposti */ int initializeControls(HWND hwndParent) { HWND hwnd; char szDeviceName[80]; char szDeviceVersion[80]; HFONT hfDefault; hfDefault=(HFONT)GetStockObject(DEFAULT_GUI_FONT); /* Perus-teksti-ikkuna */ hwnd=CreateWindowEx(WS_EX_WINDOWEDGE, "STATIC", NULL, WS_VISIBLE|WS_CHILD|SS_SIMPLE, 5, 210, 100, 20, hwndParent, (HMENU)IDS_TEXT1, GetModuleHandle(NULL), NULL); if(hwnd==NULL) return 0; SendMessage(hwnd, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(0, FALSE)); /* Combo, johon tulee kaikki videolaitteet */ hwnd=CreateWindowEx(WS_EX_CLIENTEDGE, "COMBOBOX", NULL, WS_CHILD|WS_VISIBLE|CBS_DROPDOWN, 5, 230, 250, 100, hwndParent, (HMENU)IDC_DRIVERS, GetModuleHandle(NULL), NULL); if(hwnd==NULL) return 0; SendMessage(hwnd, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(0, FALSE)); /* Haetaan tiedot laitteistosta, ja lisätään comboon */ for (int wIndex = 0; wIndex < 10; wIndex++) { if (capGetDriverDescription(wIndex, szDeviceName,sizeof (szDeviceName), szDeviceVersion, sizeof (szDeviceVersion))) SendDlgItemMessage(hwndParent, IDC_DRIVERS, CB_ADDSTRING, 0, (LPARAM)szDeviceName); } SendDlgItemMessage(hwndParent, IDC_DRIVERS, CB_SETCURSEL, 0, 1); SetWindowText(GetDlgItem(hwndParent, IDS_TEXT1), "Select a driver:"); return 1; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: if(!initializeControls(hWnd)) { MessageBox(NULL, "Error initializing other controls!", "Error", MB_ICONERROR|MB_OK); PostQuitMessage(0); } if(!initializeCaptureWindow(hWnd)) { MessageBox(NULL, "Error initializing the capture window!", "Error", MB_ICONERROR|MB_OK); PostQuitMessage(0); } /* Määritellään ominaisuudet capture-ikkunalle */ capPreviewRate(hwndCapture, 66); capPreview(hwndCapture, TRUE); break; case WM_CLOSE: capPreview(hwndCapture, FALSE); capDriverDisconnect(hwndCapture); DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); break; } return 0; } /* Tässä funktiossa ei liene Win32-API:in tutustuneille mitään outoa */ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. WNDCLASSEX wc; HWND hWnd; MSG msg; wc.cbSize=sizeof(WNDCLASSEX); wc.hCursor=LoadCursor(NULL, IDC_ARROW); wc.hIcon=LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION); wc.lpfnWndProc=WndProc; wc.hInstance=hInstance; wc.hbrBackground=(HBRUSH)(COLOR_BACKGROUND); wc.lpszClassName=g_szClassName; wc.cbClsExtra=0; wc.style=0; wc.cbWndExtra=0; wc.lpszMenuName=NULL; if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Error registering window class", "Error", MB_ICONERROR|MB_OK); return 1; } hWnd=CreateWindowEx(WS_EX_CLIENTEDGE, g_szClassName, "TestiVideoCaptureJuttu!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 325, 300, NULL, NULL, hInstance, NULL); if(hWnd==NULL) { MessageBox(NULL, "Error creating the window", "Error", MB_ICONERROR|MB_OK); return 1; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } weicco 13:12 22.7.03 Huu! Näyttää hienolta. Täytyykin hetimiten testata, jos tuo sopisi erääseen systeemiin mitä olen miettinyt vähän aikaa. Kommentointia voisi tosin olla vähän enemmän, vaikkakin koodi on melko itseäänselittävää (siis ainakin minulle). harja 13:51 22.7.03 Noniin, nyt on jotain kommentointiakin. Toivottavasti joku hyötyy niistä jotain. |
![]() Haku
|