CreateCompatibleBitmapの限界とCreateDIBSection

前置き

わりとメモのような位置づけです。自分でもあまり理解していません。
CreateCompatibleBitmapでオフスクリーンバッファを作っていたが、大きいビットマップを作れないから、CreateDIBSectionを利用する事にした。
CreateDIBSectionなら巨大なビットマップを作ることもできた。

CreateCompatibleBitmapが失敗する原因がわからない。
失敗したときにGetLastErrorで調べてみたら、8が返され、メモリ不足が原因とされた。
メモリには空きがあるのでそれはありえないはず。結局わからない。

見つけた情報

自分ではわからないので、ヒントになりそうなサイトをここに書いておきます。

2004年頃の質問

http://homepage1.nifty.com/MADIA/vc/vc_bbs/200403/200403_04030034.html
とりあえず自己解決していらっしゃいます。これは尊敬します。
CreateDIBitmapがダメだったから、CreateDIBSectionを使ったらしい。

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);

バイスコンテキストの情報を得る

MSDN
http://msdn.microsoft.com/ja-jp/library/cc428670.aspx

ピクセルあたりのビット数を調べます(1ピクセルの色を何ビットで表すかを調べる)

int n = GetDeviceCaps( hdc, BITSPIXEL);