次のような DIB セクションを作成しています。
BITMAPINFO bmi;
bmi.bmiHeader.biSize = sizeof(BITMAPINFO);
bmi.bmiHeader.biWidth = MY_WIDTH;
bmi.bmiHeader.biHeight = -MY_HEIGHT; // Order pixels from top to bottom
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32; // last byte not used, 32 bit for alignment
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
bmi.bmiColors[0].rgbBlue = 0;
bmi.bmiColors[0].rgbGreen = 0;
bmi.bmiColors[0].rgbRed = 0;
bmi.bmiColors[0].rgbReserved = 0;
hbm = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**)&pixels, NULL, 0);
塗装時:
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbm);
onFrame(pixels);
BitBlt(hdc, 0, 0, MY_WIDTH, MY_HEIGHT, hdcMem, 0, 0, SRCCOPY);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
onFrame():
void onFrame(pixel *pixels) {
// This is where all the drawing takes place
pixel *p;
// +0.005 each frame
static float frameOffset = 0;
float px; // % of the way across the bitmap
float py; // % of the way down the bitmap
for (int x = 0; x < MY_WIDTH; ++x) {
for (int y = 0; y < MY_HEIGHT; ++y) {
p = &pixels[y * MY_WIDTH + x];
px = float(x) / float(MY_WIDTH);
py = float(y) / float(MY_HEIGHT);
p->r = 0;//(unsigned char)(((cos(px + frameOffset * 10) / sin(py + frameOffset)) * cos(frameOffset * 3) * 10) * 127 + 127);
p->g = 255;//~p->r;
p->b = 255;
}
}
frameOffset += 0.005f;
}
場合によっては、Visual Studio デバッガーがすべてのステートメントを実行せずに単にペイント メソッドを終了することも (!)、アクセス違反が発生することもあれば、すべてが実行されても何も起こらないこともあります (ウィンドウは白いままです)。それは決して機能しません。これはhttp://www.daniweb.com/software-development/cpp/code/241875/fast-animation-with-the-windows-gdiのコードに基づいています; そこのコードは機能しますが、私のコードは明らかに微妙に異なります。私にとっての大きな問題は、問題をデバッグする方法がわからないことです。オブジェクトを検査する方法がわからない、アクセス違反が ntdll.dll にある (スタック トレースがない)、失敗した場合はそれほど目立たないそれは静かに失敗します。BitBlt は true を返しています (実際に呼び出される 1/4 の実行で)。onFrame() 呼び出しの前後に GdiFlush を呼び出してみましたが、あまり役に立ちませんでした。いったい何がこの問題を引き起こしているのでしょうか?