Нужно написать программу которая бы отрисовывала картинки с камеры в дочернее окно (тут приведен пример, когда картнка считывается из файла). В итоге считанная картинка не отрисовывается в дочернем окне - оно остается серым.
Код:
typedef struct
{
HWND hwnd;
RECT rect;
BOOL end_thread;
} THREADPARAMS, *PTHREADPARAMS;
// Global Variables:
HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
HWND hChildWnd;
// В оконной процедуре для главного окна WndProc создаем доченее окно
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
int wmId, wmEvent;
HINSTANCE hInstance;
WNDCLASSEX wndclass;
ZeroMemory(&wndclass, sizeof( wndclass ));
switch (message)
{
case WM_CREATE:
hInstance = ( HINSTANCE ) GetWindowLong ( hWnd, GWL_HINSTANCE );
wndclass.cbSize = sizeof (wndclass) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = NULL ;
wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW ) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject ( GRAY_BRUSH ) ;
wndclass.lpszMenuName = NULL ;
wndclass.hIconSm = NULL ;
wndclass.lpfnWndProc = ChildWndProc;
wndclass.lpszClassName = _T("ChildWnd");
RegisterClassEx (&wndclass);
hChildWnd = CreateWindow ( _T("ChildWnd"), _T("ChildWindow"),
WS_CHILDWINDOW | WS_VISIBLE, 0,0, 0, 0, hWnd, NULL, hInstance, NULL );
break;
HANDLE_MSG( hWnd, WM_PAINT, OnPaint );
HANDLE_MSG( hWnd, WM_DESTROY, OnDestroy );
HANDLE_MSG( hWnd, WM_SIZE, OnSize );
HANDLE_MSG( hWnd, WM_COMMAND, OnCommand );
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}
void OnSize( HWND hwnd, UINT state, int cx, int cy )
{
MoveWindow (hChildWnd, 5, 5, cx / 3, cy / 3, TRUE);
}
void OnPaint( HWND hwnd )
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
EndPaint (hwnd, &ps) ;
}
void OnDestroy( HWND hwnd )
{
PostQuitMessage(0);
}
void OnCommand(HWND hwnd, int id, HWND, UINT)
{
static THREADPARAMS params;
switch (id)
{
...
// Сообщение о загрузке картинки
case IDM_IMAGE_LOAD:
params.hwnd = hChildWnd;
params.end_thread = FALSE;
RECT rect;
GetClientRect( hChildWnd, &rect );
params.rect = rect;
_beginthread (Thread, 0, ¶ms);
break;
}
}
void Thread (PVOID pvoid)
{
HDC hdc;
PTHREADPARAMS pparams;
pparams = (PTHREADPARAMS) pvoid;
hdc = GetDC(pparams->hwnd) ;
RECT rc = pparams->rect;
IplImage* frame = frame = cvLoadImage( "image.jpg", CV_LOAD_IMAGE_COLOR );
IplImage* frame_res = cvCreateImage ( cvSize(rc.right-rc.left,rc.bottom-rc.top),
frame->depth, frame->nChannels);
cvResize ( frame, frame_res, CV_INTER_LINEAR );
srand( (unsigned)time( NULL ) );
while ( !pparams->end_thread )
{
int k = rand();
CvScalar color = CV_RGB((27+201*k)%256, (140+160*k)%256, (220+70*k)%256);
// Рисуем круг на картинке
cvCircle( frame_res, cvPoint( frame_res->width / 2, frame_res->height / 2), frame_res->height / 3, color, -1);
BYTE tmp[sizeof(BITMAPINFO)+255*4];
BITMAPINFO* bmi = (BITMAPINFO*)tmp;
memset(bmi, 0, sizeof(BITMAPINFO));
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi->bmiHeader.biWidth = rc.left-rc.right;
bmi->bmiHeader.biHeight = -(rc.bottom - rc.top);
bmi->bmiHeader.biPlanes = 1;
bmi->bmiHeader.biBitCount = 24;
bmi->bmiHeader.biCompression = BI_RGB;
bmi->bmiHeader.biSizeImage = (rc.right-rc.left)*(rc.bottom - rc.top);
bmi->bmiHeader.biXPelsPerMeter = 0;
bmi->bmiHeader.biYPelsPerMeter = 0;
bmi->bmiHeader.biClrUsed = 0;
bmi->bmiHeader.biClrImportant = 0;
((DWORD*)bmi->bmiColors)[0] = 0x00FF0000;
((DWORD*)bmi->bmiColors)[1] = 0x0000FF00;
((DWORD*)bmi->bmiColors)[2] = 0x000000FF;
int lines = StretchDIBits(hdc, 0, 0, (rc.right-rc.left),
(rc.bottom - rc.top), 0, 0, (rc.right-rc.left), (rc.bottom - rc.top),
frame_res->imageData, bmi, DIB_RGB_COLORS, SRCCOPY);
InvalidateRect (pparams->hwnd, NULL, TRUE) ;
UpdateWindow (pparams->hwnd) ;
}
cvReleaseImage( &frame );
cvReleaseImage( &frame_res );
_endthread () ;
}
LRESULT APIENTRY ChildWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE :
return 0 ;
case WM_SIZE :
return 0 ;
case WM_DESTROY :
return 0 ;
}
return DefWindowProc (hwnd, msg, wParam, lParam) ;
}