C# 移动图片框背景图像放弃透明度

C# 移动图片框背景图像放弃透明度,c#,image,winforms,transparency,C#,Image,Winforms,Transparency,我想移动PictureBox BackgroundImage以获得精灵功能,因此我继承了PictureBox并覆盖了OnPaintBackground: public class PictureBox1 : PictureBox { int bgX = 0, bgY = 0; public void SetImagePos(int X, int Y) { bgX = X; bgY = Y;

我想移动PictureBox BackgroundImage以获得精灵功能,因此我继承了PictureBox并覆盖了OnPaintBackground:

    public class PictureBox1 : PictureBox
    {
        int bgX = 0, bgY = 0;

        public void SetImagePos(int X, int Y) {
            bgX = X;
            bgY = Y;
            Invalidate();
            Update();
        }

        protected override void OnPaintBackground(PaintEventArgs e) {
            //base.OnPaintBackground(e);
            e.Graphics.DrawImage(BackgroundImage, -bgX, -bgY, BackgroundImage.Width, BackgroundImage.Height);
        }       
    }
但是,这会丢弃透明度。注释的
//base.OnPaintBackground(e)
恢复了透明度,但也恢复了背景上的原始图像。我还尝试了
e.Graphics.Clear(Color.Transparent)
,但背景色仍然是天鹅绒黑色。我错过了什么


我想要一个简单的解决方案,性能不是问题。

winforms中没有真正的透明性。这只意味着将使用后面控件的颜色。要允许(伪造)透明度,您需要嵌套控件,而不仅仅是重叠。是吗?@TaW您的意思是设置基础控件的背景色?因此,在WinForms中,重叠是不可能的(以一种简单的方式)?很难猜测“原始图像”是什么意思,绘制其图像属性的是PictureBox.Paint()。OnPaintBackground()绘制父对象以提供透明效果,如果看到后面的图像,则可能是窗体的背景图像。描述如何更改父级以及如何更改设计器选择父级的方式。实现精灵的最佳方法是使用Graphics.DrawImage(),它会自动分层绘制并避免控件的(大量)浪费。在
b
中嵌套控件
a
意味着
a.Parent=b
b.Controls.Add(a)
。两者都是一样的。现在
b
将通过
a
的任何透明部分发光。