2016-10-13 35 views
-1

Win32で非常に性能の低い描画を取得しています。時間がかかり、改善が必要です。お知らせ下さい。Win32での描画の実行

ここは私がしていることです。

HDC dc = GetDC(wnd); 
HDC memoryDc = CreateCompatibleDC(dc); 
HBITMAP memoryMapBitmap = CreateCompatibleBitmap(dc, 400, 400); 
HGDIOBJ originalBitmap = SelectObject(memoryDc, memoryMapBitmap); 

次に、forループを次のように描画します。

HBRUSH brush = (HBRUSH)GetStockObject(DC_BRUSH); 
SetDCBrushColor(memoryDc, colorRef); 
FillRect(memoryDc, &rect, brush); 

そして最後に、私が行うクリーンアップ

SelectObject(memoryDc, originalBitmap); 
DeleteDC(memoryDc); 
ReleaseDC(wnd, dc); 

描画に時間(数秒)がかかります。 Win32でより速く描画する方法はありますか?

ありがとうございます!

+1

'EnableFastDrawing(DRAWING_SPEED_ULTRA_FAST)'。しかし真剣に、私たちに[mcve]を教えてください。 –

+0

レンダリングサイクルを実行するたびに、オフスクリーンの描画DCを作成しているような音がします。それはコストのかかる操作です。ウィンドウサイズが変更されたときにのみ、DCを作成します。そして、あなたが 'WM_PAINT'ハンドラからすべてのレンダリングを実行しないようにするためのVery Good Reason™を持っていなければ、単にしないでください。 – IInspectable

+0

いいえ、WM_PAINTでは描画が行われません。私はファイルをロードした後に描画し、ビットマップをコントロールに入れます。何とかメモリビットマップを描画するのが非常に遅いです。残念なことに、Microsoftのドキュメントはあまり役に立ちません。私は見続けるでしょう... – Bambur

答えて

0

私はそれを解決したようです。以下はいくつかのコメントを含む解決策です。

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のネイティブコントロールがビットマップを自動的に表示する色の深度を変換するほどスマートだと思われる。

関連する問題