Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2010, 01:51   #1
eregov
Новичок
Джуниор
 
Регистрация: 10.11.2010
Сообщений: 2
Сообщение Отрисовка картинки в дочернем окне через поток

Нужно написать программу которая бы отрисовывала картинки с камеры в дочернее окно (тут приведен пример, когда картнка считывается из файла). В итоге считанная картинка не отрисовывается в дочернем окне - оно остается серым.

Код:
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, &params);
		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) ;
}
eregov вне форума Ответить с цитированием
Старый 15.11.2010, 13:43   #2
eregov
Новичок
Джуниор
 
Регистрация: 10.11.2010
Сообщений: 2
По умолчанию

Сам разобрался В функции StretchDIBits напутал с задаваемыми шириной конечного окна)
eregov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод картинки через OpenGL KIV_95 Помощь студентам 1 15.08.2010 12:18
Отрисовка в окне до вызова ReleaseDC snow_max Общие вопросы C/C++ 0 15.02.2010 14:28
Как вынести пинг через IdIcmpClient в отдельный поток ? ewgenw Помощь студентам 1 11.05.2009 16:42
Отсылка почты через отдельный поток Hottabych Работа с сетью в Delphi 16 15.03.2008 11:31
Отсылка почты через отдельный поток Hottabych Работа с сетью в Delphi 0 11.03.2008 19:32