Using AutoSize with ltmmCapture for C
The following example demonstrates automatically sizing the ltmmCapture object�s video frame window to the actual size of the media.
// define helper macros for using interfaces under C
#define COBJMACROS
// include the LEAD Multimedia TOOLKIT header
#include "ltmm.h"
#include "resource.h"
#include <tchar.h>
#include <stdio.h>
#include <assert.h>
#define SZ_WNDCLASS_CAPTURE _T("CAPTURE WNDCLASS")
#define WM_CAPTURENOTIFY (WM_USER + 1000)
HINSTANCE g_hInstance; // application instance handle
HWND g_hwndCapture; // video frame window
IltmmCapture* g_pCapture; // capture object interface pointer
//
// CaptureWndProc
// video frame window procedure
//
LRESULT CALLBACK CaptureWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
IltmmDevices* pDevices;
switch (message)
{
case WM_CREATE:
g_hwndCapture = hwnd;
// window is the video window frame
IltmmCapture_put_VideoWindowFrame(g_pCapture, (long) hwnd);
// force the frame window to be automatically resized to the video
IltmmCapture_put_AutoSize(g_pCapture, VARIANT_TRUE);
#ifdef _DEBUG
{
VARIANT_BOOL f;
IltmmCapture_get_AutoSize(g_pCapture, &f);
assert(f != 0);
}
#endif
// set preview source video only
IltmmCapture_put_PreviewSource(g_pCapture, ltmmCapture_Preview_Video);
// enable preview
IltmmCapture_put_Preview(g_pCapture, VARIANT_TRUE);
// select the first video device available
IltmmCapture_get_VideoDevices(g_pCapture, &pDevices);
IltmmDevices_put_Selection(pDevices, 0);
IUnknown_Release(pDevices);
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
HRESULT hr;
WNDCLASSEX wcex;
g_hInstance = hInstance;
// initialize COM library
hr = CoInitialize(NULL);
if(FAILED(hr))
goto error;
// register the video frame window class
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = CaptureWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = g_hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = SZ_WNDCLASS_CAPTURE;
wcex.hIconSm = NULL;
if(!RegisterClassEx(&wcex))
goto error;
// create the capture object
hr = CoCreateInstance(&CLSID_ltmmCapture, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmCapture, (void**) &g_pCapture);
if(FAILED(hr))
goto error;
// create the video frame window
if(!CreateWindow(SZ_WNDCLASS_CAPTURE, _T("Capture"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_hInstance, NULL))
goto error;
ShowWindow(g_hwndCapture, nCmdShow);
UpdateWindow(g_hwndCapture);
// process until done
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
error:
if(g_pCapture)
IUnknown_Release(g_pCapture);
CoUninitialize();
return 0;
}
The following example demonstrates automatically sizing the ltmmCapture object's video frame window to the actual size of the media.
// define helper macros for using interfaces under C #ifndef COBJMACROS #define COBJMACROS #endif // include the LEAD Multimedia TOOLKIT header #include "ltmm.h" #include "resource.h" #include <tchar.h> #include <stdio.h> #include <assert.h> #define SZ_WNDCLASS_CAPTURE _T("CAPTURE WNDCLASS") #define WM_CAPTURENOTIFY (WM_USER + 1000) HINSTANCE g_hInstance; // application instance handle HWND g_hwndCapture; // video frame window IltmmCapture* g_pCapture; // capture object interface pointer // // CaptureWndProc // video frame window procedure // LRESULT CALLBACK CaptureWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { IltmmDevices* pDevices; switch (message) { case WM_CREATE: g_hwndCapture = hwnd; // window is the video window frame IltmmCapture_put_VideoWindowFrame(g_pCapture, (long) hwnd); // force the frame window to be automatically resized to the video IltmmCapture_put_AutoSize(g_pCapture, VARIANT_TRUE); #ifdef _DEBUG { VARIANT_BOOL f; IltmmCapture_get_AutoSize(g_pCapture, &f); assert(f != 0); } #endif // set preview source video only IltmmCapture_put_PreviewSource(g_pCapture, ltmmCapture_Preview_Video); // enable preview IltmmCapture_put_Preview(g_pCapture, VARIANT_TRUE); // select the first video device available IltmmCapture_get_VideoDevices(g_pCapture, &pDevices); IltmmDevices_put_Selection(pDevices, 0); IUnknown_Release(pDevices); return 0; break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, message, wParam, lParam); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HRESULT hr; WNDCLASSEX wcex; hPrevInstance = hPrevInstance ; lpCmdLine = lpCmdLine ; nCmdShow = nCmdShow ; g_hInstance = hInstance; // initialize COM library hr = CoInitialize(NULL); if(FAILED(hr)) goto error; // register the video frame window class wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = CaptureWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = g_hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); wcex.lpszMenuName = NULL; wcex.lpszClassName = SZ_WNDCLASS_CAPTURE; wcex.hIconSm = NULL; if(!RegisterClassEx(&wcex)) goto error; // create the capture object hr = CoCreateInstance(&CLSID_ltmmCapture, NULL, CLSCTX_INPROC_SERVER, &IID_IltmmCapture, (void**) &g_pCapture); if(FAILED(hr)) goto error; // create the video frame window if(!CreateWindow(SZ_WNDCLASS_CAPTURE, _T("Capture"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, g_hInstance, NULL)) goto error; ShowWindow(g_hwndCapture, nCmdShow); UpdateWindow(g_hwndCapture); // process until done while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } error: if(g_pCapture) IUnknown_Release(g_pCapture); CoUninitialize(); return 0; }