원본 : http://www.debuglab.com/knowledge/directdraw256.html
1.요약
256색 Bitmap을 DirectDraw의 Blt()할때 간편히 사용하는 방법에 대해서 알아보겠습니다.
2.본문
DirectDraw에서 256색 Bitmap을 사용하여 블리트 시키는 경우, System DisplayMode의 Bit수(8Bit, 16Bit...)에 따라 여러가지의 처리를 해주어야 이미지가 깨지지 않습니다. 그리고 팔래트도 모두 맞추어 주어야 하지요.
이럴경우 이미지를 로드한 후 StretchDIBits()함수를 사용하여 OffScreen에 Copy한 후 BackSurface에 Blt()시키면 자동으로 이 모든 문제점들을 해결해 주기 때문에 아주 간편합니다. 물론 팔래트 처리도해줍니다. 주의할 점은 로드할 때 Pitch값을 디스플레이 모드에 맞게 설정해 주어야 합니다. 단, StretchDIBits()함수의 속도만큼 느려지는데 이것은 이미지를 Load할때 한번 뿐이므로 실제로 이미지 출력부분의 속도영향은 없습니다.
3.예제
- 2001.08.13 Smile Seo -
1.요약
256색 Bitmap을 DirectDraw의 Blt()할때 간편히 사용하는 방법에 대해서 알아보겠습니다.
2.본문
DirectDraw에서 256색 Bitmap을 사용하여 블리트 시키는 경우, System DisplayMode의 Bit수(8Bit, 16Bit...)에 따라 여러가지의 처리를 해주어야 이미지가 깨지지 않습니다. 그리고 팔래트도 모두 맞추어 주어야 하지요.
이럴경우 이미지를 로드한 후 StretchDIBits()함수를 사용하여 OffScreen에 Copy한 후 BackSurface에 Blt()시키면 자동으로 이 모든 문제점들을 해결해 주기 때문에 아주 간편합니다. 물론 팔래트 처리도해줍니다. 주의할 점은 로드할 때 Pitch값을 디스플레이 모드에 맞게 설정해 주어야 합니다. 단, StretchDIBits()함수의 속도만큼 느려지는데 이것은 이미지를 Load할때 한번 뿐이므로 실제로 이미지 출력부분의 속도영향은 없습니다.
3.예제
//******* 이미지 로드 ******************
Image->Load();
//******* Copy ************************
m_lpDDSImg = CopyImage(&Image);
//******* 로드한 이미지를 StretchDIBits()를 이용하여 Copy하기
void CopyImage(CDIB *pImg);
HDC hdc;
DDSURFACEDESC2 ddsd;
HRESULT hr;
LPDIRECTDRAWSURFACE7 lpdds;
int nWidth = pImg->GetWidth(); //이미지의 가로 넓이
int nHeight = pImg->GetHeight(); //이미지의 세로 넓이
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
//이미지의 크기에 맞게 OffScreen만들기
lpdds = ddCreateOffScreen(nWidth, nHeight, 0, 0);
if(lpdds == NULL)
return NULL;
lpdds->Restore();
lpdds->GetSurfaceDesc(&ddsd);
hr = lpdds->GetDC(&hdc); //핸들 얻기
if(hr == DD_OK)
{
// Copy 하기
StretchDIBits(hdc,
0, // dest x
0, // dest y
nWidth, // dest width
nHeight, // dest height
0, // src x
0, // src y
nWidth, // src width
nHeight, // src height
pDibSpr->m_pBits, //bits
pDibSpr->m_pBmpInfo,
DIB_RGB_COLORS, // options
SRCCOPY); // rop
lpdds->ReleaseDC(hdc);
}
//************** offscreen을 BackSurface에 Blt()시키기 *****
if(FAILED(m_lpBackSurface->Blt(&rDest, m_lpDDSImage,
&rSrc, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
return FALSE;
- 2001.08.13 Smile Seo -
"MFC" 카테고리의 다른 글
- 특정 Registry Key안의 Value값 가져오기 (0)2007/03/01
- 프로그램안에서 Registry 이름 지정하기 (0)2007/03/01
- DirectDraw에서 256색 Bitmap 간편히 사용하기 (0)2007/03/01
- 메모리 DC 사용하기 (0)2007/03/01
- 일반적인 윈도우 소멸 순서 (0)2007/03/01
Tags DirectDraw

수안이의 컴퓨터 연구실



Leave your greetings.