์ง๊ตฌ์ ๋๋ฅ๊ณผ ๋์์ ํํ๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฐ ์์ด ๊ฐ์ฅ ํฐ ์ฅ์ ๋ฌผ์ ๋ฌด์ง๊ฐ ์๋๋ผ ์ง์์ ๋ง์์ด์๋ค. โ๋ค๋์ J.๋ถ์ด์คํด
์ฃผ์์ฌํญ #
- ์ฌ๊ธฐ ์ ์๋ ์์ ํด๋์ค๋ ๊ทธ์ ๋ง๋ค์ด์ง HDC์ ๊ทธ๋ฆฌ๋ ๋ถ๋ถ๋ง ๊ตฌํ๋์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ ๋น DDB๋ฅผ ์์ฑํ๋ค์ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
SetDIBitsToDevice()์ ์ฌ์ฉํ์ฌ ์์ฑํ DIB ๋ฐ์ดํ๋ฅผ ์ง์ ํ HDC์ ๊ทธ๋ฆฝ๋๋ค.
DIB.hpp #
#ifndef ___DIB_H___
#define ___DIB_H___
#include <windows.h>
struct DIB
{
BITMAPFILEHEADER *hFileBitmap;
BITMAPINFOHEADER *hInfoBitmap;
int Width, Height;
BYTE *pBitmap;
TDIB();
virtual ~TDIB();
// DIB ํ์ผ์ ์ฝ์ด๋ค์ธ๋ค. (ํ์ผ๋ช
์ ์ ์ฒด Path๋ฅผ ์ง์ด๋ฃ๋๋ค)
BOOL LoadFromFullPathFile(LPTSTR FullPathFilename);
// DIB ํ์ผ์ ์ญ์ ์ฝ์ด๋ค์ธ๋ค. ^_^ (ํ์ฌ ๋๋ ํ ๋ฆฌ์์ ์ฝ๋๋ค)
BOOL LoadFromFile(LPTSTR Filename);
// DIBํ์ผ์ ์ฝ์ด๋ค์๋?
inline BOOL IsLoaded() {return (hFileBitmap != NULL);};
// ์ํ๋ HDC์ ์ถ๋ ฅํ๋ค.
void DrawBitmap(HDC hdc, int x, int y);
};
#endif
DIB.cpp #
// TDIB.cpp: DIBํ์ผ ์ ์ด ํด๋์ค
//
//////////////////////////////////////////////////////////////////////
#include "TDIB.h"
#include <stdio.h>
//////////////////////////////////////////////////////////////////////
TDIB::TDIB()
{
// DIB๊ฐ ์ฝ์ด๋ค์ด์ง ์์ ์ํ๋ก ํ์ํ๋ค.
hFileBitmap = NULL;
}
TDIB::~TDIB()
{
// ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค.
if (hFileBitmap != NULL) free(hFileBitmap);
}
//////////////////////////////////////////////////////////////////////
BOOL TDIB::LoadFromFullPathFile(LPTSTR Filename)
{
HANDLE hFile;
DWORD FileSize, dwRead;
// ํ์ผ์ ์ฐ๋ค.
hFile = CreateFile(Filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
// ํ์ผ์ ์ฝ์ง ๋ชปํ๋ฉด ๋๋ธ๋ค.
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
// ๋นํธ๋งตํ์ผ์ ํฌ๊ธฐ๋ฅผ ๊ตฌํ๋ค.
FileSize = GetFileSize(hFile, NULL);
// ํ์ผ์ ๋ณดํค๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ด์์ผ๋ฉด ํด์ ํ๊ณ ๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
if (hFileBitmap != NULL) free(hFileBitmap);
hFileBitmap = (BITMAPFILEHEADER *)malloc(FileSize);
// ํ์ผ๋ก๋ถํฐ ๋นํธ๋งต์ ์ฝ์ด๋ค์ธ๋ค.
ReadFile(hFile, hFileBitmap, FileSize, &dwRead, NULL);
// ๋ค์ฝ์์ผ๋ ํ์ผ์ ๋ซ๋๋ค.
CloseHandle(hFile);
// pBitmap์ ๋นํธ๋งต์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ ๋ถ๋ถ์ ์ฃผ์๋ฅผ ์ง์ ํ๋ค.
pBitmap = (PBYTE) hFileBitmap + (hFileBitmap->bfOffBits);
// BITMAPINFOHEADER์ ์ฃผ์๋ฅผ ์ง์ ํ๋ค.
hInfoBitmap = (BITMAPINFOHEADER *) ((PBYTE) hFileBitmap + sizeof(BITMAPFILEHEADER));
// ๋นํธ๋งต์ ํญ๊ณผ ๋์ด ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
Width = hInfoBitmap->biWidth;
Height = hInfoBitmap->biHeight;
return TRUE;
}
BOOL TDIB::LoadFromFile(LPTSTR Filename)
{
TCHAR tmpCurrDir[256], tmpFullPathFilename[256];
GetCurrentDirectory(256, tmpCurrDir);
sprintf(tmpFullPathFilename, "%s\\%s", tmpCurrDir, Filename);
return LoadFromFullPathFile(tmpFullPathFilename);
}
void TDIB::DrawBitmap(HDC hdc, int x, int y)
{
SetDIBitsToDevice(
hdc, x, y, Width, Height,
0, 0,
0, // first scan line in array
Height, // number of scan lines
pBitmap,
(BITMAPINFO *)hInfoBitmap,
DIB_RGB_COLORS);
}









