CreateCompatibleBitmapの限界とCreateDIBSection
前置き
わりとメモのような位置づけです。自分でもあまり理解していません。
CreateCompatibleBitmapでオフスクリーンバッファを作っていたが、大きいビットマップを作れないから、CreateDIBSectionを利用する事にした。
CreateDIBSectionなら巨大なビットマップを作ることもできた。
CreateCompatibleBitmapが失敗する原因がわからない。
失敗したときにGetLastErrorで調べてみたら、8が返され、メモリ不足が原因とされた。
メモリには空きがあるのでそれはありえないはず。結局わからない。
見つけた情報
自分ではわからないので、ヒントになりそうなサイトをここに書いておきます。
2004年頃の質問
http://homepage1.nifty.com/MADIA/vc/vc_bbs/200403/200403_04030034.html
とりあえず自己解決していらっしゃいます。これは尊敬します。
CreateDIBitmapがダメだったから、CreateDIBSectionを使ったらしい。
CreateDIBSectionについて
MSDN
http://msdn.microsoft.com/ja-jp/library/cc428334.aspx
http://msdn.microsoft.com/ja-jp/library/z5731wbz.aspx
http://msdn.microsoft.com/ja-jp/library/cc352308.aspx
CreateDIBSectionによる汎用ビットマップ
http://lcl.web5.jp/prog/dibsec.html
DIBとかDDBとか(DIB=BMPはデバイスに依存しない, DDBは依存する)
BMP形式入門 - BMPファイルの中身をちょっと覗いてみる
http://www.geocities.co.jp/Playtown-Knight/6845/sd_doc/format_windib.html
標準 Windows API (100〜116番あたり)
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html
おまけ
// 大きいメモリデバイスコンテキストを作る(べつに小さくてもOK) BITMAPINFO bmpinfo; ZeroMemory(&bmpinfo, sizeof(bmpinfo)); bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmpinfo.bmiHeader.biWidth = x; // サイズ bmpinfo.bmiHeader.biHeight = y; // bmpinfo.bmiHeader.biPlanes = 1; bmpinfo.bmiHeader.biBitCount = 32; // 32ビットカラー bmpinfo.bmiHeader.biCompression = BI_RGB; hNewBmp = CreateDIBSection( NULL, &bmpinfo, DIB_RGB_COLORS, NULL, NULL, NULL); // 今作ったビットマップを、メモリデバイスコンテキストに選択する SelectObject( hNewDC, hNewBmp);