C++ StretchBlt绘制空白位图
我使用默认的Windows.h函数来绘制。我使用StretchBlt绘制位图。但是它(StretchBlt)绘制了一个空白位图(即如果我在rop中不使用白度,它的总黑度) 我有一个结构来绘制组件 VM_油漆的部分C++ StretchBlt绘制空白位图,c++,winapi,gdi,C++,Winapi,Gdi,我使用默认的Windows.h函数来绘制。我使用StretchBlt绘制位图。但是它(StretchBlt)绘制了一个空白位图(即如果我在rop中不使用白度,它的总黑度) 我有一个结构来绘制组件 VM_油漆的部分 PAINTSTRUCT-ps; HDC HDC=开始喷漆(hwnd和ps); SetStretchBltMode(hdc,白色或黑色); cv.DrawComponents(hdc); 端漆(hwnd和ps); 在DrawComponents()上: HDC hdcMem=Creat
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hwnd和ps);
SetStretchBltMode(hdc,白色或黑色);
cv.DrawComponents(hdc);
端漆(hwnd和ps);
在DrawComponents()上:
HDC hdcMem=CreateCompatibleDC(HDC);
对于(int i=0;iDraw(hdc、hdcMem、Screen\u乘法器);
}
DeleteDC(hdcMem);
最后,组件:
class-ElectriComp
{
受保护的:
无符号短连接数;
浮动x=0,y=0,cx=0.5,cy=0.5;
坐标维数;
PBITMAP位图;
公众:
无符号int*连接;
ElectriComp(无符号短连接编号,PBITMAP b)
:connectionNum{connectionNum}
{
位图=b;
连接=新的无符号整数[connectionNum];
}
无效设置位置(整数x,整数y)
{
这个->x=x;
这->y=y;
}
无效绘制(HDC HDC、HDC hdcMem、浮动屏幕MUL)
{
HGDIOBJ old=SelectObject(hdcMem,CreateBitmapIndirect(位图));
StretchBlt(hdc,(x-cx)*ScreenMul,(y-cy)*ScreenMul,Dimensions.x*ScreenMul,Dimensions.y*ScreenMul,hdcMem,0,0,位图->bmWidth,位图->bmHeight,SRCCOPY);
选择对象(hdcMem,旧);
}
~ElectriComp()
{
删除连接;
}
};
编辑#1:正如所指出的,我通过了PBITMAP而不是HBITMAP。我通过CreateBitmapIndirect获得了句柄。问题仍然存在,屏幕上的图像仍然为空,而SelectObject不返回NULL
编辑#2:将图形旋转更改为:
void DrawComponents(HDC HDC)
{
HDC hdcMem=CreateCompatibleDC(HDC);
COLORREF prevC=SetTextColor(hdc,RGB(255,0,0));
COLORREF prevB=SETBKCLOR(hdc,RGB(0,255,0));
对于(int i=0;i绘图(hdc、hdcMem、屏幕乘法器、benchSpace.left、benchSpace.top);
}
}
DeleteDC(hdcMem);
}
我得到一个红方块。所以我认为问题在于加载位图。
这是它的rotine:
case WM\u创建:
GetObject(加载位图(GetModuleHandle(NULL)、MAKEINTRESOURCE(ResistorBMP))、sizeof(resistorBM)和resistorBM);
返回0;
ResistorBMP在我的参考资料中是一个位图。正如@IgorTandetnik指出的,它期望
HBITMAP
而不是PBITMAP
此外,请确保位图是有效的位图。例如,如果使用加载位图,请确保返回值是有效的句柄,而不是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);
最后,为函数调用添加错误检查将帮助您找到问题。您没有显示足够的代码。你的位图是如何创建的?@JonathanPotter我从参考资料中加载它。这是一个1bit 25x25位图。在单色位图中,您可能需要设置文本/背景颜色。请参阅。
PBITMAP
和HBITMAP
根本不是一回事SelectObject
想要后者,但您正在传递前者。检查SelectObject
的返回值;我预测它会失败。您好,我检查过了,加载位图时没有出现错误。@Warmagedon007基于您更新的代码的当前版本似乎只返回位图的宽度、高度和颜色格式信息,而不返回位图的位值。(位图结构的bmBits
将为NULL
)替换CreateBitmapIndirect(位图)
使用LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ResistorBMP))
将起作用。