Win32 LayeredWindow给出了糟糕的视觉效果

时间:2015-04-16 08:12:39

标签: user-interface winapi gdi alpha-transparency layered-windows

我正在开发一个具有所有智能功能的UI系统,如面板撕开和对接等。现在我的任务是在屏幕上创建一个覆盖图,显示撕开或可停靠面板将落地的位置。与visual studio相同的东西。 为此我正在使用一个自定义的分层窗口类,它将在需要时显示出来。在那之后,我开始挖掘以达到所需的效果。 我之前使用的是标准的GDI函数,基本上它们没问题。但是这次我按照文档建议使用UpdateLayeredWindow来完成我的任务,并从位图加载32位图像而不是用GDI函数绘制它。 所以这里我有一个128x128像素宽的bmp,​​其中alpha通道为222,RGB为255 0 0

以下是我用于初始化和绘图的方法。

void Init(HDC in_hdc,HWND in_hwnd)
    {
        bf = { 0, 0, 200, AC_SRC_ALPHA };
        hwnd = in_hwnd;
        hdc_mem = CreateCompatibleDC(in_hdc);
        hBitmap_mem = CreateCompatibleBitmap(in_hdc, canvas_size.cx, canvas_size.cy);
        hBitmap_mem_default = (HBITMAP)SelectObject(hdc_mem, hBitmap_mem);
        hdc_bitmap = CreateCompatibleDC(in_hdc);
    }
    void DrawArea(RECT& in_rect)
    {
        hBitmap_area_default = (HBITMAP)SelectObject(hdc_bitmap, hBitmap_area);
        AlphaBlend(hdc_mem, in_rect.left, in_rect.top, in_rect.right, in_rect.bottom, hdc_bitmap, 0, 0, 2, 2, bf);
        hBitmap_area = (HBITMAP)SelectObject(hdc_bitmap, hBitmap_area_default);
    }
    void Update()
    {
        POINT p = { 0, 0 };
        HDC hdc_screen = GetDC(0);
        UpdateLayeredWindow(hwnd, hdc_screen, &p, &canvas_size, hdc_mem, &p, 0, &bf, ULW_ALPHA);
    }

窗口样式有这个附加功能 WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST

这就是我得到的。 因此,您可以看到发生的混合DOES会考虑每像素alpha,但它会执行错误的混合作业。 任何想法如何调整它? enter image description here

1 个答案:

答案 0 :(得分:1)

我怀疑问题出在源位图中。当RGB值未与alpha预乘时,这是一种效果。但忽略这一点,因为有一种更为简单的方法。

  • 通过在hbrBackground结构中设置WNDCLASSEX,创建一个背景色为纯色的分层窗口。

  • 通过调用SetLayeredWindowAttributes使窗口部分透明。

  • 将窗口放在您想要的位置。

那就是它。

This answer的代码说明了该技术的用途略有不同。