2014년 10월 29일 수요일

LPD3DXBUFFER 버퍼에 있는 내용을 DC에 그리기

g_hWnd = <윈도우 핸들>

 g_pTexture = <Direct3D>



...

 HRESULT hr;

 // D3DXSaveTextureToFileInMemory를 이용하여, Memory상에 BMP로 저장하고 그것을 이용한다.

 LPD3DXBUFFER pBuffer = NULL;

 hr = D3DXSaveTextureToFileInMemory(&pBuffer, D3DXIFF_BMP, g_pTexture, NULL);



 // 헤더를 읽고

 BITMAPFILEHEADER *pHeader = (BITMAPFILEHEADER*)pBuffer->GetBufferPointer();

 BITMAPINFOHEADER *pInfo = (BITMAPINFOHEADER*)((BYTE*)pBuffer->GetBufferPointer() + sizeof(BITMAPFILEHEADER));

 BITMAPINFO bmpInfo;

 memset(&bmpInfo, 0, sizeof(bmpInfo));

 bmpInfo.bmiHeader = *pInfo;

 void *pData = (void*)((BYTE*)pBuffer->GetBufferPointer() + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));



 // 동일한 DIBSECTION을 만든다.

 HDC hDC = GetDC(g_hWnd);

 HDC hMemDC = CreateCompatibleDC(hDC);

 BYTE *pPixel = NULL;

 HBITMAP hMemDCBitmap = CreateDIBSection(hMemDC,&bmpInfo, DIB_RGB_COLORS, (void**)&pPixel, NULL, 0);

 SelectObject(hMemDC, hMemDCBitmap);



 // BITMAP의 내용을 복사

 memcpy(pPixel  , pData, pInfo->biWidth*pInfo->biHeight*pInfo->biBitCount/ 8);

 pBuffer->Release();



 // GDI 화면에 BitBlt로 복사하여 그리기

 BitBlt(hDC, 0, 0, pInfo->biWidth, pInfo->biHeight, hMemDC, 0, 0, SRCCOPY);



 // DIBSection 제거

 DeleteDC(hMemDC);

 DeleteObject(hMemDCBitmap);


그러하다.

댓글 없음: