私はそれを解決したようです。以下はいくつかのコメントを含む解決策です。
RC-ファイルで定義されたダイアログがあります。ダイアログにビットマップイメージを表示するコントロールがあります。
HWND map = GetDlgItem(dlg, IDC_MEMORY_MAP);
HBITMAP bitmap = createMemoryMapBitmap(map);
bitmap = (HBITMAP)SendMessage(map, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)bitmap);
DeleteObject(bitmap); // (!) this is a very important line, otherwise old bitmap leaks
コードを作成するために、ビットマップのサイズを見つけ出し:
HBITMAP createMemoryMapBitmap(HWND map) {
RECT rect = {0, 0, 0, 0};
GetClientRect(map, &rect);
SIZE size = {rect.right - rect.left, rect.bottom - rect.top};
HDC dc = GetDC(map);
HBITMAP bitmap = doCreateMemoryMapBitmap(dc, &size);
ReleaseDC(map, dc);
return bitmap;
}
最後に、私はビットマップを作成、描画し、表示する必要があり、実行時に
CONTROL "", IDC_MEMORY_MAP, WC_STATIC, SS_BITMAP | SS_CENTERIMAGE | SS_SUNKEN, 9, 21, 271, 338, WS_EX_LEFT
実際にビットマップを作成して描画します:
HBITMAP doCreateMemoryMapBitmap(HDC dc, LPSIZE bitmapSize) {
// create 24bpp bitmap in memory in order to draw fast
BITMAPINFO info;
memset(&info, 0, sizeof(info));
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth = bitmapSize->cx;
info.bmiHeader.biHeight = bitmapSize->cy;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = 24;
info.bmiHeader.biCompression = BI_RGB;
void *pixels = NULL;
HBITMAP memoryBitmap = CreateDIBSection(dc, &info, DIB_RGB_COLORS, &pixels, NULL, 0);
HDC memoryDc = CreateCompatibleDC(dc); // (!) memoryDc is attached to current thread
HGDIOBJ originalDcBitmap = SelectObject(memoryDc, memoryBitmap);
// drawing code here
// perform windows gdi cleanup
SelectObject(memoryDc, originalDcBitmap); // restore original bitmap in memoryDC (optional step)
DeleteDC(memoryDc); // this releases memoryBitmap from memoryDC
return memoryBitmap;
}
上記の考え方は、メモリに24bppビットマップを作成して描画することです。 @Inspectableが指摘したように、この方法では描画が高速になります。
ディスプレイがインデックス付きカラーモードにある場合、たとえば、 16または256色、それはWindowsのネイティブコントロールがビットマップを自動的に表示する色の深度を変換するほどスマートだと思われる。
'EnableFastDrawing(DRAWING_SPEED_ULTRA_FAST)'。しかし真剣に、私たちに[mcve]を教えてください。 –
レンダリングサイクルを実行するたびに、オフスクリーンの描画DCを作成しているような音がします。それはコストのかかる操作です。ウィンドウサイズが変更されたときにのみ、DCを作成します。そして、あなたが 'WM_PAINT'ハンドラからすべてのレンダリングを実行しないようにするためのVery Good Reason™を持っていなければ、単にしないでください。 – IInspectable
いいえ、WM_PAINTでは描画が行われません。私はファイルをロードした後に描画し、ビットマップをコントロールに入れます。何とかメモリビットマップを描画するのが非常に遅いです。残念なことに、Microsoftのドキュメントはあまり役に立ちません。私は見続けるでしょう... – Bambur