//----------------------------------------------------------------------------
// BITMAPファイルを読む
//----------------------------------------------------------------------------
// HBITMAP LoadBitmapFile(
// LPSTR filename, // ロードするファイルパス
// LPBITMAPINFO bmpinfo // BITMAPINFO構造体を受け取るポインタ(必要無いときはNULL)
// );
//
// 関数が成功したときロードした画像のBITMAPハンドルを返す。
// 失敗したときは、NULLを返す。
//----------------------------------------------------------------------------
HBITMAP LoadBitmapFile(LPSTR filename,LPBITMAPINFO bmpinfo)
{
// ファイル読み込み
HFILE fp = _lopen(filename,OF_READ);
if(fp == HFILE_ERROR)return NULL;
LONG size = _llseek(fp,0,FILE_END);
LPBYTE buf = (LPBYTE)malloc(size);
if(buf == NULL){
_lclose(fp);
return NULL;
}
_llseek(fp,0,FILE_BEGIN);
_lread(fp,buf,size);
_lclose(fp);
// BMPヘッダーかどうかチェック
if(memcmp(buf,"BM",2) != 0){
free(buf);
return NULL;
}
// BITMAP情報を格納する
// bmpinfoには、sizeof(BITMAPFILEHEADER)+sizeof(RGBQUAD)*256バイト以上の
// 領域を確保しておく必要があります。
if(bmpinfo != NULL)memcpy(bmpinfo,buf + sizeof(BITMAPFILEHEADER),sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
// BITMAP作成
LPBITMAPFILEHEADER fh = (LPBITMAPFILEHEADER)buf;
LPBITMAPINFOHEADER ih = (LPBITMAPINFOHEADER)(buf + sizeof(BITMAPFILEHEADER));
LPBITMAPINFO bi = (LPBITMAPINFO)(buf + sizeof(BITMAPFILEHEADER));
LPBYTE img = buf + fh->bfOffBits;
HDC dc = GetDC(0);
HBITMAP hb = CreateDIBitmap(dc,ih,CBM_INIT,img,bi,DIB_RGB_COLORS);
ReleaseDC(0,dc);
free(buf);
return hb;
}
//----------------------------------------------------------------------
// 以下は、与えられたウィンドゥhwnd にBITMAP画像を貼り付けます。
//----------------------------------------------------------------------
// 読み込み準備(BITMAPINFO構造体を確保)
LPBITMAPINFO bmpinfo = (LPBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
// BITMAP読み込み
HBITMAP bmp = LoadBitmapFile("bitmap.bmp",NULL);
// 貼り付け準備
HDC dc = GetDC(hwnd);
HDC memdc = CreateCompatibleDC(dc);
SelectObject(memdc,bmp);
// 貼り付け
BitBlt(dc,0,0,bmpinfo->bmiHeader.biWidth,bmpinfo->bmiHeader.biHeight,memdc,0,0,SRCCOPY);
// 後始末
ReleaseDC(hwnd,dc);
DeleteDC(memdc);
DeleteObject(bmp);
free(bmpinfo);