【发布时间】:2015-06-22 12:29:51
【问题描述】:
我正在开发一个 UI 系统,它具有所有智能功能,例如面板撕下和对接等。现在我的任务是在屏幕上创建一个覆盖层,显示撕下或可对接面板的位置.与视觉工作室几乎相同的东西。 为此,我使用了一个自定义的分层窗口类,它会在需要时显示出来。之后我开始挖掘以达到所需的效果。 我以前使用标准的 GDI 函数,基本上它们没问题。但是这次我按照文档建议使用 UpdateLayeredWindow 来完成我的任务,并从位图中加载 32 位图像,而不是使用 GDI 函数绘制它。 所以这里我有一个 128x128pixel 宽的 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
这就是我得到的。 所以你可以看到发生的混合确实考虑了每像素的 alpha,但它的混合工作很糟糕。 任何想法如何调整它?
【问题讨论】:
-
为什么在你的混合函数结构中使用 200。对于每像素 alpha 值,您需要使用 255。
标签: user-interface winapi gdi alpha-transparency layered-windows