【问题标题】:Draw a transparent line using native win32 gdi使用原生 win32 gdi 绘制透明线
【发布时间】:2019-03-16 16:26:57
【问题描述】:

我正在使用 win32 gdi 本机 api 绘制线条。现在,我想把这条线画成透明的。我已经在颜色中设置了 alpha 通道属性。但是,将 Alpha 通道设置为颜色并不是将线条绘制为透明的。我阅读了有关 Alpha Blend Api 的信息,但无法找到解决方案。

var hdc = g.GdiDeviceContext;
var srcHdc = CreateCompatibleDC(hdc);

var clipRegion = CreateRectRgn(x, y, x + width, y + height);

SelectClipRgn(hdc, clipRegion);

var pen = CreatePen(PenStyle.Solid, LineWidth, (uint)ColorTranslator.ToWin32(colour));



if (pen != IntPtr.Zero)
{
     var oldPen = SelectObject(hdc, pen);
     Polyline(hdc, points, points.Length);
     SelectObject(hdc, oldPen);
     DeleteObject(pen);
}

SelectClipRgn(hdc, IntPtr.Zero);
AlphaBlend(hdc, x, y, width, height, srcHdc, x, y, width, height, new BlendFunction(0x00, 0, 0x7f, 0x00));
DeleteObject(clipRegion);

我正在尝试将线画成透明的。

【问题讨论】:

标签: c# winapi gdi


【解决方案1】:
var srcHdc = CreateCompatibleDC(hdc);

这将创建一个内存设备上下文。这是正确的第一步。但是内存 dc 还没有准备好。它也需要一个内存位图。

SelectObject(hdc, pen);
Polyline(hdc, points, points.Length);

这将利用 Windows 设备上下文。但是我们想绘制内存设备上下文,然后使用AlphaBlend将内存绘制到HDC

请看下面的例子:

int w = 100;
int h = 100;

//create memory device context
var memdc = CreateCompatibleDC(hdc); 

//create bitmap
var hbitmap = CreateCompatibleBitmap(hdc, w, h);

//select bitmap in to memory device context
var holdbmp = SelectObject(memdc, hbitmap);

//begine drawing:
var hpen = CreatePen(0, 4, 255);
var holdpen = SelectObject(memdc, hpen);
Rectangle(memdc, 10, 10, 90, 90);

//draw memory device (memdc) context on to windows device context (hdc)
AlphaBlend(hdc, 0, 0, w, h, memdc, 0, 0, w, h, new BLENDFUNCTION(0, 0, 128, 0));

//clean up:
SelectObject(memdc, holdbmp);
SelectObject(memdc, holdpen);
DeleteObject(hbitmap);
DeleteObject(hpen);
DeleteDC(memdc);

【讨论】:

  • 感谢您的回答 :) 。我按照这些步骤首先创建了内存 dc 并为其分配了位图。之后,我在 memdc 上完成了所有绘图,然后将其与 hdc 混合。但是,我仍然没有得到透明度(128 因子)。它完全不透明。
  • 我测试了这段代码,它用预期的颜色绘制了一个矩形。它将显示为红色阴影。没有透明度。你可以称之为“半透明”。它正在混合颜色。也许你想要TransparentBlt
猜你喜欢
  • 2012-06-13
  • 2022-08-11
  • 1970-01-01
  • 2017-07-02
  • 2011-01-01
  • 2021-08-03
  • 2012-03-27
  • 1970-01-01
  • 2015-03-23
相关资源
最近更新 更多