Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ StretchBlt绘制空白位图_C++_Winapi_Gdi - Fatal编程技术网

C++ StretchBlt绘制空白位图

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

我使用默认的Windows.h函数来绘制。我使用StretchBlt绘制位图。但是它(StretchBlt)绘制了一个空白位图(即如果我在rop中不使用白度,它的总黑度)

我有一个结构来绘制组件

VM_油漆的部分

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))
将起作用。