Написал нижеприведенную ф-ию для захвата кадра с любого места окна/экрана и отображения его в окне/экране. Если захватывть статическое изображение - все работает, при захвате видео выводиться черный кадр, который при позиционировании его над видео просвечивается. В чем может быть проблема? OS:WinXP
Код | int fGrabSourceToTarget(HWND hTarget,int iTrgX,int iTrgY,int iWidth,int iHeight, HWND hSource,int iSrcX,int iSrcY) { // указатели на используемые контексты HDC hSourceDC,hMemDC,hTargetDC; // указатель на битмап контекста памяти по умолчанию HBITMAP hOldBit=NULL; // указатель на новый битмап для контекста памяти Graphics::TBitmap *hBitmap=NULL; // флаг ошибки bool bIsError=false; int itemp=0;
// Получить контекс на источник hSourceDC=::GetDC(hSource); if(hSourceDC==NULL)return 0; // Получить контекс на целевой объект hTargetDC=::GetDC(hTarget); if(hTargetDC==NULL) { bIsError=true; goto mClean; }
// создать контекст памяти совместимый с // контекстом источника hMemDC=::CreateCompatibleDC(hSourceDC); if(hMemDC==NULL) { bIsError=true; goto mClean; }
// Для контекста памяти устанавливаем тот же // режим отображения, что используется в // контексте источнике
if(!::SetMapMode(hMemDC, GetMapMode(hSourceDC))) { bIsError=true; goto mClean; }
//создать объект TBitmap hBitmap=new Graphics::TBitmap(); if(hBitmap==NULL) { bIsError=true; goto mClean; }
//задать размеры копируемой области hBitmap->Width=iWidth; hBitmap->Height=iHeight;
// Сменить bitmap в контексте памяти hOldBit=::SelectObject(hMemDC,hBitmap->Handle); if(hOldBit==NULL) { bIsError=true; goto mClean; }
// грабим изображение из источника в память if(!BitBlt(hMemDC,0,0,iWidth,iHeight, hSourceDC,iSrcX,iSrcY,SRCCOPY)) { bIsError=true; goto mClean; }
/*Что-либо делаем с изображением в памяти*/
// отображаем из памяти в целевой объект if(!BitBlt(hTargetDC,iTrgX,iTrgY,iWidth,iHeight, hMemDC,0,0,SRCCOPY)) { bIsError=true; goto mClean; }
// Метка очистки(освобождения используемых ресурсов) mClean: // Востоновить контекст памяти if(hOldBit!=NULL)::SelectObject(hMemDC,hOldBit);
// удалить объект TBitmap if(hBitmap!=NULL)delete hBitmap;
// удалить контекст памяти if(hMemDC!=NULL)::DeleteDC(hMemDC);
// Освободить контекс целевого объекта if(hTargetDC!=NULL)::ReleaseDC(hTarget,hTargetDC);
// Освободить контекс источника if(hSourceDC!=NULL)::ReleaseDC(hSource,hSourceDC);
// проверка на ошибку if(bIsError)return 0;
return 1; }
|
|