4

ウィンドウのコンテンツ領域にcharバッファをレンダリングする方法を探しています。これは単なる疑似ですが、私が実際にやりたいことを示すことを目的としています。

char buffer[300][200][3];    // 300px x 200px x RGB bytes
// ... render stuff into buffer
FancyWindowsFunctionToRenderBufferOnWindow(my_hwnd, buffer, 300, 200, offset_x, offset_y);

同様のことをする方法はありますか?

4

2 に答える 2

8

デバイスに依存しないビットマップ(DIB)を作成する必要があると思います。アプリケーションウィンドウに配置する準備ができているピクセルの配列がすでにある場合は、配列全体をCreateDIBSection APIによって割り当てられたバッファーにコピーし、BitBltを呼び出してDIBをウィンドウに転送する必要があります。これは、Win32プラットフォームのコンピュータ画面に表示される画像として単なるピクセルの配列を表示するために私が知っている唯一の方法であり、非常に複雑で理解するのが困難です。

これが、あなたがやりたいことに似たものをテストするために私が取ったステップです:

DIBの作成:

BITMAPINFO bmi;
memset(&bmi, 0, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = /* Width of your image buffer */
bmi.bmiHeader.biHeight = - /* Height of your image buffer */
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

HDC hDesktopDC = GetDC(GetDesktopWindow());
HBITMAP hDib = CreateDIBSection(hDesktopDC, &bmi, DIB_RGB_COLORS, (void **)&buffer, 0, 0);
if (buffer == NULL) { /* ERROR */ }
HDC hDibDC = CreateCompatibleDC(hDesktopDC);
HGDIOBJ hOldObj = SelectObject(hDibDC, hDib);

/* Copy your array of pixels to buffer allocated above. */

ReleaseDC(GetDesktopWindow(), hDesktopDC);

WM_PAINTイベントハンドラーの実装(hWnd変数は以下のウィンドウハンドルを保持します):

case WM_PAINT:
    PAINTSTRUCT paint;
    HDC hWndDc = BeginPaint(hWnd, &paint);
    BitBlt(hWndDC, 0, 0, /* Width of DIB */, /* Height of DIB */,
           /* HDC of DIB (hDibDC in the above) */, 0, 0, SRCCOPY);
    EndPaint(hWnd, &paint);
    break;

上記のコードスニペットが直接役立つとは思いません。上記のスニペットのようなGDI関数を使用することにした場合は、MSDNのAPIドキュメントを注意深く読むことをお勧めします。APIの使用中に取得したDCまたはGDIオブジェクトを適切に解放または削除するのは非常に難しいためです。

于 2012-04-07T12:44:56.780 に答える
5

画像(ラスター)が文字の配列として保存されているようです(通常、生のビットマップ画像には符号なし文字の配列が必要なため、これは奇妙な選択です)。

特定の配置制約を満たしている場合は、SetDIBitsを使用してビットマップを直接表示できます。ピクセル形式と画像の寸法を説明するBITMAPINFO構造体に入力し、それをデータと一緒にSetDIBitsに渡します。それらをDCにペイントします。すべてのパラメータを正しく取得するのは少し難しい場合があります。

アライメント要件は、各スキャンラインが4バイト境界で開始する必要があることです。その要件を満たしていない場合は、ストライドが間違っているのと同じようにゴミが発生します。必要に応じて、正しい配置でデータのコピーを作成できます。

于 2012-04-05T22:57:59.393 に答える