直接访问CreateDIBitmap位

时间:2017-05-22 23:36:19

标签: winapi

[最终修复,无条件工作:使用SetDIBitsToDevice,而不是BitBlt,复制出文本后绘制的图像数据。通过此更改,所有出现的问题都消失了。]

我解决了我遇到的问题,但对于我的生活,我无法弄清楚它为什么会发生。

  1. 使用CreateDIBitmap创建位图。获取指向位图位的指针。
  2. 将位图选择到内存DC中。
  3. 后台通过直接写入位图内存来填充位图。
  4. 的TextOut。
  5. 不显示任何文字。
  6. 解决问题的方法是:将项目3从直接填充更改为对FillRect的调用。一切都很好,它完美无缺。

    这是在Windows 10下,但是从我在网络上找不到的东西,它涵盖了所有版本的Windows。在手动写入之后,没有操作在位图上工作 - 甚至调用FillRect。没有精明的,Kimosabe。在应用程序的其他地方,我甚至通过直接写入该位图内存来构建渐变填充,并且没有问题。但是一旦在手动填充之后调用TextOut,位图就会被锁定(有效)并且没有其他函数可以使用它 - 也不会返回任何错误。

    我使用的是带有90度擒纵机构的字体。没有尝试过“普通”字体,0度擒纵机构。具有DT_CALCRECT的DrawTextEx明确指出它仅适用于0度擒纵字体,因此我不得不使用TextOut。

    非常离奇。

    不,没有像使用相同的文字颜色作为背景颜色那样的愚蠢错误。我为此花了太长时间。人们可以选择的一种选择是,通常用于破坏问题的无穷无尽的能量和/或提出问题的人可以用来编写几行代码并自己尝试。

1 个答案:

答案 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;
}