1

我正在尝试HBITMAP使用 Win32 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 位的。因此,在尝试显示屏幕截图时,不正确的位指定显然会导致一些问题。在结构中将位设置为 32BITMAPINFOHEADER解决了我的问题。

4

0 回答 0