透明窗体上的半透明图像

时间:2009-09-26 09:32:01

标签: c# .net transparency

我需要在完全透明的表格上绘制半透明图像(通过使用Alpha混合) - 这意味着图像将在透明内容上绘制。

目前,即使窗口本身是透明的,图像也总是在窗口背景颜色上绘制。

这是当前状态,感谢您的帮助。

public Form1()
{
    InitializeComponent();

    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);

    MakeTransparent();
}

private void MakeTransparent()
{
    NativeMethods.SetLayeredWindowAttributes(Handle, COLORREF.FromColor(BackColor), 255, Constants.ULW_ALPHA | Constants.ULW_COLORKEY);
}

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp =  base.CreateParams;
        cp.Style |= (Constants.WS_EX_LAYERED | Constants.WS_EX_TOOLWINDOW);
        return cp;
    }
}

private void OnPaint(object sender, PaintEventArgs e)
{
    using (Bitmap bitmap = new Bitmap("c:\\semi-transparent.png"))
    {
        e.Graphics.DrawImage(bitmap, 0, 0);
    }
}

2 个答案:

答案 0 :(得分:1)

我猜因为Form不支持​​透明背景颜色,所以这可能是不可能的。这样,即使在绘制带有Alpha通道的图像时,表单的背景总是也会有颜色。

这是一个类似的问题:

答案 1 :(得分:1)

好的,谢谢你的答案。

我实际上可以通过使用UpdateLayeredWindow函数来实现这一点,但即使我真的需要重绘窗口的一小部分,我也必须始终更新整个窗口位图。

捕获屏幕内容并在图像下绘制并不是真正的解决方案,因为我需要我的窗口可移动。