我正在尝试使用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;
}
注意:我使用GetWindowLong的原因是因为我有一个Window类,我有多个实例。我使用GetWindowLong来获取窗口类的实例。
上面的代码只会导致在窗口上绘制默认窗口颜色。我做错了什么?
我试图显示的位图是截图。当我拍摄截图时,我在BITMAPINFOHEADER
中指定了一个24位位图,这是不正确的,因为屏幕截图实际上是32位。因此,在尝试显示屏幕截图时,错误的位规范显然会引起一些问题。在BITMAPINFOHEADER
结构中将位设置为32解决了我的问题。