// 画像サイズを求めるマクロ
#define GET_DIBSIZE(bi) (\
(bi->bmiHeader.biSizeImage != 0) ? bi->bmiHeader.biSizeImage : \
(((bi->bmiHeader.biWidth * (bi->bmiHeader.biBitCount / 8) + 3) & 0xfffffffc) * bi->bmiHeader.biHeight)\
)
class CDIBSection{
public:
// パブリックメンバ
HBITMAP m_bmp;
HANDLE m_map;
LPBYTE m_bits,m_topimage;
LONG m_width,m_height,m_pitch;
// メンバ関数
CDIBSection():m_bmp(NULL),m_map(NULL),m_bits(NULL){;}
~CDIBSection(){Delete();}
BOOL Create(HDC dc,LPBITMAPINFO bi,UINT usage){
Delete();
if(CreateMap(GET_DIBSIZE(bi))){
m_bmp = CreateDIBSection(dc,bi,usage,(LPVOID *)&m_bits,m_map,0);
m_width = bi->bmiHeader.biWidth;
m_height = bi->bmiHeader.biHeight;
m_pitch = - ((m_width * bi->bmiHeader.biBitCount + 3) & 0xfffffffc);
m_topimage = m_bits - (m_height - 1) * m_pitch;
return (m_bmp != NULL);
}
return FALSE;
}
BOOL CreateMap(DWORD size){
m_map = CreateFileMapping((HANDLE)0xffffffff,NULL,PAGE_READWRITE,NULL,size,NULL);
return (m_map != NULL);
}
void Delete(){
if(m_bmp != NULL){
DeleteObject(m_bmp);
CloseHandle(m_map);
}
m_bmp = NULL;
m_map = NULL;
}
operator HBITMAP(){return m_bmp;}
};
// 使用方法を簡単に置いておきます。
// あとはメンバを見て、各自研究してみてください。
// クラスの定義
CDIBSection dibs;
// メモリデバイスコンテキスト
HDC memdc;
// ビットマップを生成し、メモリデバイスコンテキストに関連付けする
BITMAPINFO bi;
ZeroMemory(&bi,sizeof(bi));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = 640;
bi.bmiHeader.biHeight = 480;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
HDC dc;
dc = GetDC(0);
dibs.Create(dc,&bi,DIB_RGB_COLORS);
memdc = CreateCompatibleDC(dc);
SelectObject(memdc,dibs);
ReleaseDC(0,dc);
// ビットマップのアクセス
*((LPBYTE)dibs.m_topimage + dibs.m_pitch * y + 3 * x + 0) = 0; // b
*((LPBYTE)dibs.m_topimage + dibs.m_pitch * y + 3 * x + 1) = 0; // g
*((LPBYTE)dibs.m_topimage + dibs.m_pitch * y + 3 * x + 2) = 0; // r