LoadIcon, LoadCurosr, LoadBitmap 16비트 함수의 모든 기능을 통합해서 가지는 함수이며 몇가지 추가적인 기능을 더 가지고 있다. 이미지를 DIB 색션으로 읽을 수 있으며 파일 형태의 이미지를 읽을 수 있는 능력이 있으며 투명 처리, 크기 선택 등의 옵션이 적용된다. 32비트 프로그램에서는 가급적이면 이 함수로 이미지를 읽는 것이 좋다.
이 함수를 사용하면 DIB 파일을 읽어와 화면으로 출력할 수 있다.
이미지를 프린터로 출력할 때나 표준 크기가 아닌 아이콘을 읽을 때는 LoadIcon, LoadBitmap 대신 반드시 이 함수를 사용해야 한다.
// 정보 구조체 + 팔레트 크기만큼 메모리를 할당하고 이 버퍼에
// 정보 구조체를 복사한다.
PalSize=(ih.biBitCount > 8 ? 0:1 << ih.biBitCount)*sizeof(RGBQUAD);
pih=(BITMAPINFO *)malloc(ih.biSize+PalSize);
pih->bmiHeader=ih;
// 비트맵의 크기를 구한다. GetDIBits(hdc,hbit,0,bit.bmHeight,NULL,pih,DIB_RGB_COLORS);
ih=pih->bmiHeader;
// 비트맵 크기가 구해지지 않았을 경우 수작업으로 직접 계산한다.
if (ih.biSizeImage == 0) {
ih.biSizeImage=((((ih.biWidth*ih.biBitCount)+31) & ~31) >> 3) * ih.biHeight;
}
// 래스터 데이터를 읽기위해 메모를 재할당한다.
Size=ih.biSize+PalSize+ih.biSizeImage;
pih=(BITMAPINFO *)realloc(pih,Size);
// 래스터 데이터를 읽어들인다. GetDIBits(hdc,hbit,0,bit.bmHeight,(PBYTE)pih+ih.biSize+PalSize,pih,DIB_RGB_COLORS);
// 파일 헤더를 만든다.
fh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+PalSize;
fh.bfReserved1=0;
fh.bfReserved2=0;
fh.bfSize=Size+sizeof(BITMAPFILEHEADER);
fh.bfType=0x4d42;
// 파일을 생성하고 파일 헤더와 정보 구조체, 팔레트, 래스터 데이터를 출력한다.
hFile=CreateFile(Path,GENERIC_WRITE,0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,&fh,sizeof(fh),&dwWritten,NULL);
WriteFile(hFile,pih,Size,&dwWritten,NULL);
The DrawBitmap() function can be used with both a DDB and a DIB section. This function does take into account that the destination device context might have a map mode other than MM_TEXT. This might not work always or the effect may not be what you want.
// DrawBitmap - Draws a bitmap (DDB & DIB section) onto a device
// pDC - Pointer to a device context
// hBitmap - Handle of the bitmap
// hPal - Handle of a logical palette associated with the bitmap
// xDest - x-coordinate of the upper-left corner of the destination rect
// yDest - y-coordinate of the upper-left corner of the destination rect
void DrawBitmap( CDC *pDC, HBITMAP hBitmap, HPALETTE hPal, int xDest, int yDest )
{
// Get logical coordinates
BITMAP bm;
::GetObject( hBitmap, sizeof( bm ), &bm );
CPoint size( bm.bmWidth, bm.bmHeight );
pDC->DPtoLP(&size);
CPoint org(0,0);
pDC->DPtoLP(&org);
// Create a memory DC compatible with the destination DC
CDC memDC;
memDC.CreateCompatibleDC( pDC );
memDC.SetMapMode( pDC->GetMapMode() );
// DrawDIB - Draws a DIB onto a device
// pDC - Pointer to a device context
// hDIB - Handle of the device-independent bitmap
// pPal - Pointer to a palette associated with the DIB
// xDest - x-coordinate of the upper-left corner of the destination rect
// yDest - y-coordinate of the upper-left corner of the destination rect
void DrawDIB( CDC* pDC, HGLOBAL hDIB, CPalette *pPal, int xDest, int yDest )
{
LPVOID lpDIBBits; // Pointer to DIB bits
BOOL bSuccess=FALSE; // Success/fail flag
// Select and realize the palette if one supplied and if device supports it
if( pPal && (pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) )
{
pDC->SelectPalette(pPal, FALSE);
pDC->RealizePalette();
}