Windows 将位图绘制到窗口会导致屏幕空白

Windows 将位图绘制到窗口会导致屏幕空白,windows,winapi,bitmap,window,Windows,Winapi,Bitmap,Window,我正在尝试使用Win32 API将HBITMAP绘制到窗口 我创建的位图如下所示: 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

我正在尝试使用Win32 API将
HBITMAP
绘制到窗口

我创建的位图如下所示:

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;
}
然后我尝试将位图绘制到窗口,如下所示:

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获取window类的实例

上面的代码只会导致在窗口上绘制默认的窗口颜色。我做错了什么

答案如下
我试图显示的位图是一个屏幕截图。拍摄屏幕截图时,我在
BitMapInfo头文件中指定了一个24位位图,这是不正确的,因为屏幕截图实际上是32位的。因此,当试图显示屏幕截图时,不正确的位规范显然导致了一些问题。在
bitmapinfo结构中将位设置为32解决了我的问题。

如何定义
pw->bitmap
位图?是否有可能位图已被选择到另一个DC?pw->位图被定义为
HBITMAP*bitmap
。位图尚未选择到另一个DC中。我想唯一明显的问题是,
displayBmp
true和
bitmap
non-NULL?是的,在if范围内设置断点验证了这一点。编辑:将位图类型更改为32位后,图像显示良好,只是图像颠倒了。我应该能解决这个问题。