我需要在完全透明的表格上绘制半透明图像(通过使用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);
}
}
答案 0 :(得分:1)
我猜因为Form不支持透明背景颜色,所以这可能是不可能的。这样,即使在绘制带有Alpha通道的图像时,表单的背景总是也会有颜色。
这是一个类似的问题:
答案 1 :(得分:1)
好的,谢谢你的答案。
我实际上可以通过使用UpdateLayeredWindow函数来实现这一点,但即使我真的需要重绘窗口的一小部分,我也必须始终更新整个窗口位图。
捕获屏幕内容并在图像下绘制并不是真正的解决方案,因为我需要我的窗口可移动。