Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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++ 为什么在内存位图上绘图不';你不能按预期工作吗?_C++_Gdi+ - Fatal编程技术网

C++ 为什么在内存位图上绘图不';你不能按预期工作吗?

C++ 为什么在内存位图上绘图不';你不能按预期工作吗?,c++,gdi+,C++,Gdi+,我试图在内存位图上绘制,结果很奇怪。这是我的代码: HDC hdcScreen = GetDC(hWnd); HDC hdcMemory = CreateCompatibleDC(hdcScreen); HBITMAP hMemoryBitmap = CreateCompatibleBitmap(hdcScreen, w, h); HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hMemoryBitmap); Graphics *m

我试图在内存位图上绘制,结果很奇怪。这是我的代码:

HDC hdcScreen = GetDC(hWnd);
HDC hdcMemory = CreateCompatibleDC(hdcScreen);
HBITMAP hMemoryBitmap = CreateCompatibleBitmap(hdcScreen, w, h);

HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hMemoryBitmap);

Graphics *memoryGraphics = Graphics::FromHDC(hdcMemory);
SolidBrush brush(Color(255, 255, 0, 0));
memoryGraphics->FillRectangle(&brush, 0, 0, w, h);

POINT dcOffset = { 0, 0 };
SIZE size = { w, h };
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 255;
bf.AlphaFormat = AC_SRC_ALPHA;

UpdateLayeredWindow(hWnd, hdcScreen, &dcOffset, &size, hdcMemory, &dcOffset, 0, &bf, ULW_ALPHA);

delete memoryGraphics;
ReleaseDC(hWnd, hdcScreen);
SelectObject(hdcMemory, hBitmapOld);
DeleteDC(hdcMemory);
DeleteObject(hMemoryBitmap);

它给了我半透明!为什么?我在画笔中清楚地指定了
Color(255,255,0,0)

UpdateLayeredWindow()之前,你能试着调用
memoryGraphics->Flush()
吗。或者更好的办法是,尝试将
删除内存图形
移动到
UpdateLayeredWindow()
@rodrigo Yep之前。结果是一样的。但我在中发现了这一点:“所有四个分量值的范围都是从0到255。alpha分量值为0指定颜色是透明的,alpha值为255指定颜色是不透明的。alpha分量值从1到254指定渲染颜色时颜色与背景混合的程度。”我不能完全理解,但也许是这样。我把alpha设为254,这就解决了一个问题。254这个东西真奇怪!它可能与以下内容有关:当AlphaFormat成员为AC_SRC_ALPHA时,源位图必须为32 bpp。也许你的位图是24 bpp?当使用部分透明的颜色(a!=255)时,它会变异为32 bpp?您可以尝试将
CreateCompatibleBitmap()
替换为更具体的一个.Hmm。我更改了行
HBITMAP hmemorybamimp=CreateCompatibleBitmap(hdcScreen,w,h)
位图存储器位图(w、h、像素格式32bpparGB);HBITMAP hMemoryBitmap;GetHBITMAP(0,&hMemoryBitmap)和所有工作。谢谢