StretchBlt 绘制空白位图
StretchBlt draw a blank bitmap
我正在使用默认的 Windows.h 函数进行绘图。我使用 StretchBlt 绘制位图。但是它(StretchBlt)绘制了一个空白位图(即如果我不在 rop 中使用 WHITENESS,它的全黑)。
我有一个结构来绘制组件
节VM_PAINT
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
SetStretchBltMode(hdc, WHITEONBLACK);
cv.DrawComponents(hdc);
EndPaint(hwnd, &ps);
在 DrawComponents() 上:
HDC hdcMem = CreateCompatibleDC(hdc);
for (int i = 0; i < size; i++)
{
if (spaceFlags[i]) components[i]->Draw(hdc, hdcMem, Screen_Multiplier);
}
DeleteDC(hdcMem);
最后是组件:
class ElectriComp
{
protected:
unsigned short connectionNum;
float x = 0, y = 0, cx = 0.5, cy = 0.5;
COORD dimentions;
PBITMAP bitmap;
public:
unsigned int* Connections;
ElectriComp(unsigned short connectionnum, PBITMAP b)
: connectionNum{ connectionnum }
{
bitmap = b;
Connections = new unsigned int[connectionNum];
}
void SetPlace(int x, int y)
{
this->x = x;
this->y = y;
}
void Draw(HDC hdc, HDC hdcMem, float ScreenMul)
{
HGDIOBJ old = SelectObject(hdcMem, CreateBitmapIndirect(bitmap));
StretchBlt(hdc, (x - cx) * ScreenMul, (y - cy) * ScreenMul, dimentions.X * ScreenMul, dimentions.Y * ScreenMul, hdcMem, 0, 0, bitmap->bmWidth, bitmap->bmHeight, SRCCOPY);
SelectObject(hdcMem, old);
}
~ElectriComp()
{
delete Connections;
}
};
编辑#1:如前所述,我传递的是 PBITMAP 而不是 HBITMAP。我通过 CreateBitmapIndirect 获得了句柄。问题仍然存在,屏幕上的图像仍然空白,而 SelectObject 没有 return NULL。
编辑#2:将绘图循环更改为:
void DrawComponents(HDC hdc)
{
HDC hdcMem = CreateCompatibleDC(hdc);
COLORREF prevC = SetTextColor(hdc, RGB(255, 0, 0));
COLORREF prevB = SetBkColor(hdc, RGB(0, 255, 0));
for (int i = 0; i < size; i++)
{
if (spaceFlags[i])
{
components[i]->Draw(hdc, hdcMem, Screen_Multiplier, benchSpace.left, benchSpace.top);
}
}
DeleteDC(hdcMem);
}
我得到一个红色方块。所以我认为问题出在加载位图中。
这是它的循环:
case WM_CREATE:
GetObject(LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ResistorBMP)), sizeof(resistorBM), &resistorBM);
return 0;
ResistorBMP 是我资源中的位图。
正如@IgorTandetnik 指出的那样,SelectObject
期望 HBITMAP
而不是 PBITMAP
。
此外,请确保位图是有效的位图。例如,如果您使用 LoadImage
加载位图,请确保 return 值是有效句柄而不是 NULL
。
以下是您可以参考的工作示例:
HBITMAP HBitmap = (HBITMAP)LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
BITMAP bitmap;
int iReturn = GetObject(HBitmap, sizeof(BITMAP), (LPSTR)(&bitmap));
RECT client;
GetClientRect(hWnd, &client);
HGDIOBJ old = SelectObject(hdcMem, HBitmap);
StretchBlt(hdc, 0, 0, client.right, client.bottom, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
最后,为函数调用添加错误检查,帮助您发现问题。
我正在使用默认的 Windows.h 函数进行绘图。我使用 StretchBlt 绘制位图。但是它(StretchBlt)绘制了一个空白位图(即如果我不在 rop 中使用 WHITENESS,它的全黑)。
我有一个结构来绘制组件
节VM_PAINT
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
SetStretchBltMode(hdc, WHITEONBLACK);
cv.DrawComponents(hdc);
EndPaint(hwnd, &ps);
在 DrawComponents() 上:
HDC hdcMem = CreateCompatibleDC(hdc);
for (int i = 0; i < size; i++)
{
if (spaceFlags[i]) components[i]->Draw(hdc, hdcMem, Screen_Multiplier);
}
DeleteDC(hdcMem);
最后是组件:
class ElectriComp
{
protected:
unsigned short connectionNum;
float x = 0, y = 0, cx = 0.5, cy = 0.5;
COORD dimentions;
PBITMAP bitmap;
public:
unsigned int* Connections;
ElectriComp(unsigned short connectionnum, PBITMAP b)
: connectionNum{ connectionnum }
{
bitmap = b;
Connections = new unsigned int[connectionNum];
}
void SetPlace(int x, int y)
{
this->x = x;
this->y = y;
}
void Draw(HDC hdc, HDC hdcMem, float ScreenMul)
{
HGDIOBJ old = SelectObject(hdcMem, CreateBitmapIndirect(bitmap));
StretchBlt(hdc, (x - cx) * ScreenMul, (y - cy) * ScreenMul, dimentions.X * ScreenMul, dimentions.Y * ScreenMul, hdcMem, 0, 0, bitmap->bmWidth, bitmap->bmHeight, SRCCOPY);
SelectObject(hdcMem, old);
}
~ElectriComp()
{
delete Connections;
}
};
编辑#1:如前所述,我传递的是 PBITMAP 而不是 HBITMAP。我通过 CreateBitmapIndirect 获得了句柄。问题仍然存在,屏幕上的图像仍然空白,而 SelectObject 没有 return NULL。
编辑#2:将绘图循环更改为:
void DrawComponents(HDC hdc)
{
HDC hdcMem = CreateCompatibleDC(hdc);
COLORREF prevC = SetTextColor(hdc, RGB(255, 0, 0));
COLORREF prevB = SetBkColor(hdc, RGB(0, 255, 0));
for (int i = 0; i < size; i++)
{
if (spaceFlags[i])
{
components[i]->Draw(hdc, hdcMem, Screen_Multiplier, benchSpace.left, benchSpace.top);
}
}
DeleteDC(hdcMem);
}
我得到一个红色方块。所以我认为问题出在加载位图中。 这是它的循环:
case WM_CREATE:
GetObject(LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ResistorBMP)), sizeof(resistorBM), &resistorBM);
return 0;
ResistorBMP 是我资源中的位图。
正如@IgorTandetnik 指出的那样,SelectObject
期望 HBITMAP
而不是 PBITMAP
。
此外,请确保位图是有效的位图。例如,如果您使用 LoadImage
加载位图,请确保 return 值是有效句柄而不是 NULL
。
以下是您可以参考的工作示例:
HBITMAP HBitmap = (HBITMAP)LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
BITMAP bitmap;
int iReturn = GetObject(HBitmap, sizeof(BITMAP), (LPSTR)(&bitmap));
RECT client;
GetClientRect(hWnd, &client);
HGDIOBJ old = SelectObject(hdcMem, HBitmap);
StretchBlt(hdc, 0, 0, client.right, client.bottom, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
最后,为函数调用添加错误检查,帮助您发现问题。