[最终修复,无条件工作:使用SetDIBitsToDevice,而不是BitBlt,复制出文本后绘制的图像数据。通过此更改,所有出现的问题都消失了。]
我解决了我遇到的问题,但对于我的生活,我无法弄清楚它为什么会发生。
解决问题的方法是:将项目3从直接填充更改为对FillRect的调用。一切都很好,它完美无缺。
这是在Windows 10下,但是从我在网络上找不到的东西,它涵盖了所有版本的Windows。在手动写入之后,没有操作在位图上工作 - 甚至调用FillRect。没有精明的,Kimosabe。在应用程序的其他地方,我甚至通过直接写入该位图内存来构建渐变填充,并且没有问题。但是一旦在手动填充之后调用TextOut,位图就会被锁定(有效)并且没有其他函数可以使用它 - 也不会返回任何错误。
我使用的是带有90度擒纵机构的字体。没有尝试过“普通”字体,0度擒纵机构。具有DT_CALCRECT的DrawTextEx明确指出它仅适用于0度擒纵字体,因此我不得不使用TextOut。
非常离奇。
不,没有像使用相同的文字颜色作为背景颜色那样的愚蠢错误。我为此花了太长时间。人们可以选择的一种选择是,通常用于破坏问题的无穷无尽的能量和/或提出问题的人可以用来编写几行代码并自己尝试。
答案 0 :(得分:1)
这是制作位图的功能。不要通过简单的颜色,通过渐变填充,说从白色到粉红色。 它显示正确吗?如果是这样,那么TextOut调用是否有效?
static HBITMAP MakeBitmap(unsigned char *rgba, int width, int height, VOID **buff)
{
VOID *pvBits; // pointer to DIB section
HBITMAP answer;
BITMAPINFO bmi;
HDC hdc;
int x, y;
int red, green, blue, alpha;
// setup bitmap info
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32; // four 8-bit components
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = width * height * 4;
hdc = CreateCompatibleDC(GetDC(0));
answer = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);
for (y = 0; y < height; y++)
{
for (x = 0; x < width; x++)
{
red = rgba[(y*width + x) * 4];
green = rgba[(y*width + x) * 4 + 1];
blue = rgba[(y*width + x) * 4 + 2];
alpha = rgba[(y*width + x) * 4 + 3];
red = (red * alpha) >> 8;
green = (green * alpha) >> 8;
blue = (blue * alpha) >> 8;
((UINT32 *)pvBits)[(height - y - 1) * width + x] = (alpha << 24) | (red << 16) | (green << 8) | blue;
}
}
DeleteDC(hdc);
*buff = pvBits;
return answer;
}