来自FillRectangle的不希望有的透明性

幽灵般的

我有一个使用WS_EX_LAYERED窗口样式创建的窗口。我目前正在使用GDI +绘制内存位图,并UpdateLayeredWindow用于更新分层窗口的图形内容。

这是我的代码片段:

void Redraw(HWND hWnd, int width, int height) {
    static bool floppy = true;

    floppy = !floppy;

    HDC hScreenDC = GetDC(HWND_DESKTOP);
    HDC hMemDC = CreateCompatibleDC(hScreenDC);
    HBITMAP hBmp = CreateCompatibleBitmap(hScreenDC, width, height);
    HGDIOBJ hObj = SelectObject(hMemDC, hBmp);

    Graphics gfx(hMemDC);

    SolidBrush b(Color(254, (floppy ? 255 : 0), (floppy ? 0 : 255), 0));
    gfx.FillRectangle(&b, Rect(0, 0, width, height));

    BLENDFUNCTION blend;
    blend.BlendOp = AC_SRC_OVER;
    blend.BlendFlags = 0;
    blend.SourceConstantAlpha = 255;
    blend.AlphaFormat = AC_SRC_ALPHA;

    POINT src = { 0, 0 };

    SIZE size;
    size.cx = width;
    size.cy = height;

    Assert(UpdateLayeredWindow(
        hWnd,
        hScreenDC,
        NULL,
        &size,
        hMemDC,
        &src,
        RGB(0, 0, 0),
        &blend,
        ULW_ALPHA
    ));

    SelectObject(hMemDC, hObj);
    DeleteObject(hBmp);
    DeleteDC(hMemDC);
    ReleaseDC(HWND_DESKTOP, hScreenDC);
}

创建my时SolidBrush,我为alpha组件指定了254的值。这导致99.6%的不透明填充,这不是我想要的。

当我将255指定为alpha分量时,似乎没有填充。我的窗口变得完全透明。这是一个问题,因为我希望绘制100%不透明的形状,但我也希望绘制不透明的形状。

幽灵般的

似乎有些夸张FillRectangle当我们观察到,使用本变得明显FillEllipse具有SolidBrush其阿尔法分量为255,导致形状被呈现完美(不透明)。

我提出了两个解决方法,分别为我解决了这个问题:

  • 打电话 FillRectangle 两次

    SolidBrush b(Color(254, 255, 0, 0));
    gfx.FillRectangle(&b, Rect(0, 0, width, height));
    gfx.FillRectangle(&b, Rect(0, 0, width, height));
    

    由于同一区域被填充两次,因此它们将混合并创建RGB(255,0,0),而不管窗口后面的内容如何(现在它是100%不透明的)。我不喜欢这种方法,因为它要求每个矩形绘制两次。

  • 使用 替代FillPolygon

    正如FillEllipseFillPolygon似乎并不具有色彩问题,除非你调用它像这样

    SolidBrush b(Color(255, 255, 0, 0));
    Point points[4];
    points[0] = Point(0, 0);
    points[1] = Point(width, 0);
    points[2] = Point(width, height);
    points[4] = Point(0, height);
    gfx.FillPolygon(&b, points, 4); //don't copy and paste - this won't work
    

    上面的代码将导致100%透明的窗口。我猜想这是由于某种形式的优化将调用传递给了FillRectangle或者-最有可能-出现了一些问题FillPolygon,称为FillRectangle但是,如果Point在数组中添加额外的内容,则可以解决该问题:

    SolidBrush b(Color(255, 255, 0, 0));
    Point points[5];
    points[0] = Point(0, 0);
    points[1] = Point(0, 0); //<-
    points[2] = Point(width, 0);
    points[3] = Point(width, height);
    points[4] = Point(0, height);
    gfx.FillPolygon(&b, points, 5);
    

    上面的代码确实将绘制100%不透明的形状,从而解决了我的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Wayland会具有网络透明性吗?

来自分类Dev

当图本身具有透明性时,如何使Gnuplot中的图的键不具有透明性?

来自分类Dev

Skrollr背景透明性?

来自分类Dev

例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

来自分类Dev

例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

来自分类Dev

OpenGL透明性不透明

来自分类Dev

从航行中退回不希望有的田地

来自分类Dev

反应:html <select>中的不希望有的箭头

来自分类Dev

从航行中退回不希望有的田地

来自分类Dev

OpenGL透明性无法正常工作

来自分类Dev

如何超越CSS的透明性方面

来自分类Dev

Gnome终端的背景透明性

来自分类Dev

有没有办法避免不透明性被继承?

来自分类Dev

在Mac上具有功能透明性,但在Windows上没有?

来自分类Dev

定义参考透明性和确定性功能之间有什么区别?

来自分类Dev

ImageIO.read()是否总是返回具有透明性的BufferedImage吗?

来自分类Dev

将JPG转换为具有背景透明性的PNG

来自分类Dev

带有透明性的python opencv cv2 matchTemplate

来自分类Dev

PHP:将文本更改为具有透明性的PNG图像的功能

来自分类Dev

C#将具有透明性的PNG复制到剪贴板

来自分类Dev

如何使用CSS淡化图像而没有不透明性?

来自分类Dev

带有GNOME Classic的GNOME终端透明性(无效果)

来自分类Dev

带有GNOME Classic的GNOME终端透明性(无效果)

来自分类Dev

从浏览器复制具有透明性的PNG会显示黑色背景

来自分类Dev

有关OpenGL透明性的一些问题

来自分类Dev

ImageIO.read()是否总是返回具有透明性的BufferedImage?

来自分类Dev

拖动时,Windows变成具有完全内部透明性的黑白框架

来自分类Dev

具有不透明性的Bootstrap模态出现在背景后面

来自分类Dev

javascript 函数是否具有可变状态的引用透明性?

Related 相关文章

  1. 1

    Wayland会具有网络透明性吗?

  2. 2

    当图本身具有透明性时,如何使Gnuplot中的图的键不具有透明性?

  3. 3

    Skrollr背景透明性?

  4. 4

    例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

  5. 5

    例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

  6. 6

    OpenGL透明性不透明

  7. 7

    从航行中退回不希望有的田地

  8. 8

    反应:html <select>中的不希望有的箭头

  9. 9

    从航行中退回不希望有的田地

  10. 10

    OpenGL透明性无法正常工作

  11. 11

    如何超越CSS的透明性方面

  12. 12

    Gnome终端的背景透明性

  13. 13

    有没有办法避免不透明性被继承?

  14. 14

    在Mac上具有功能透明性,但在Windows上没有?

  15. 15

    定义参考透明性和确定性功能之间有什么区别?

  16. 16

    ImageIO.read()是否总是返回具有透明性的BufferedImage吗?

  17. 17

    将JPG转换为具有背景透明性的PNG

  18. 18

    带有透明性的python opencv cv2 matchTemplate

  19. 19

    PHP:将文本更改为具有透明性的PNG图像的功能

  20. 20

    C#将具有透明性的PNG复制到剪贴板

  21. 21

    如何使用CSS淡化图像而没有不透明性?

  22. 22

    带有GNOME Classic的GNOME终端透明性(无效果)

  23. 23

    带有GNOME Classic的GNOME终端透明性(无效果)

  24. 24

    从浏览器复制具有透明性的PNG会显示黑色背景

  25. 25

    有关OpenGL透明性的一些问题

  26. 26

    ImageIO.read()是否总是返回具有透明性的BufferedImage?

  27. 27

    拖动时,Windows变成具有完全内部透明性的黑白框架

  28. 28

    具有不透明性的Bootstrap模态出现在背景后面

  29. 29

    javascript 函数是否具有可变状态的引用透明性?

热门标签

归档