1

HBITMAPWin32 API を使用してウィンドウに描画しようとしています。

次のようにビットマップを作成します。

HBITMAP hBmp = CreateBitmap(bi->biWidth, bi->biHeight, 1, bi->biBitCount, pBits);

次に、次のようにビットマップをウィンドウに描画しようとします。

case WM_PAINT:
{
    Window *pw = (Window *)GetWindowLong(hWnd, GWLP_USERDATA);

    RECT rc;
    GetClientRect(hWnd, &rc);

    if(pw->displayBmp && (pw->bitmap != NULL))
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        HDC memDC = CreateCompatibleDC(hdc);
        HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, *pw->bitmap);
        BITMAP bmp;
        GetObject(*pw->bitmap, sizeof(BITMAP), &bmp);

        StretchBlt(hdc, 0, 0, rc.right - rc.left, rc.bottom - rc.top, memDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);

        //Cleanup
        SelectObject(memDC, oldBmp);
        DeleteDC(memDC);

        EndPaint(hWnd, &ps);
    }
    else
        DefWindowProc(hWnd, msg, wParam, lParam);

    break;
}

注: GetWindowLong を使用している理由は、複数のインスタンスを持つ Window クラスがあるためです。GetWindowLong を使用してウィンドウ クラスのインスタンスを取得します。

上記のコードは、デフォルトのウィンドウの色がウィンドウに描画されるだけです。私は何を間違っていますか?

解決済み、以下に回答

表示しようとしていたビットマップはスクリーンショットでした。スクリーンショットを撮ったときに、 で 24 ビットのビットマップを指定しましたBITMAPINFOHEADERが、実際にはスクリーン キャプチャが 32 ビットだったので、これは正しくありませんでした。そのため、スクリーンショットを表示しようとすると、ビット指定が正しくないために明らかにいくつかの問題が発生しました。構造体でビットを 32 に設定するとBITMAPINFOHEADER、問題が解決しました。

4

0 に答える 0