控件有问题的背景图片

时间:2019-02-27 15:06:31

标签: c# image winforms transparency

我已经完成了一个小型测试程序,以原型化将图像(在右侧)(使用按钮作为支撑)拖放到面板(左侧)的方法(当前面板背景字母仅用于测试目的)并将其移动到面板周边。

image2

在“绘画”事件期间,手动绘制了移动控件上的图像:

    void bouton_Paint( object sender, PaintEventArgs e )
    {
        Button but = sender as Button;

        Bitmap img = new Bitmap(WindowsFormsApplication1.Properties.Resources.triaxe);
        img.MakeTransparent(Color.White);
        e.Graphics.DrawImage(img, 0, 0, but.Width, but.Height);
    }

如下所示,在移动过程中,移动的控件的背景变得模糊。所以不是很漂亮

image

是否可以使进度更顺畅?

谢谢。

这是在表单上移动三轴的代码:

    void bouton_MouseUp( object sender, MouseEventArgs e )
    {
        Button button = sender as Button;

        button.Tag = false;
        button.BackColor = Color.Transparent;
    }

    void bouton_MouseMove( object sender, MouseEventArgs e )
    {
        Button button = sender as Button;
        if (button.Tag != null && (bool)button.Tag == true)
        {
            button.Left += e.X - MouseDownLocation.X;
            button.Top += e.Y - MouseDownLocation.Y;
        }
    }

    private Point MouseDownLocation;

    void bouton_MouseDown( object sender, MouseEventArgs e )
    {
        Button button = sender as Button;

        MouseDownLocation = e.Location;
        button.Tag = true;
        button.BackColor = SystemColors.Control;
    }

1 个答案:

答案 0 :(得分:0)

让我们假设您不想单独绘制图形,而是希望将具有透明性的Control移动到另一个Control之上。

您必须解决两个问题:

  1. Winforms不能很好地支持透明度。您有两种选择:

    • 要么让系统为您伪造
    • 或者自己做假。

首先,具有透明背景色的控件和具有透明性的Image或BackgroundImage(取决于控件类型),然后在背景控件中嵌套,就足够了。 / p>

要进行简单测试,可以将if (button.Parent != panel1) button.Parent = panel1;添加到鼠标按下代码中。这看起来跳动,但应正确显示透明度。 (不要忘记使Backcolor透明;在代码中将其设为SystemColors.Control

要自己进行伪造,您将完全按照系统的要求进行操作:

  • 您将目标表面以位图形式(使用DrawToBitmap),然后将移动器当前覆盖的区域与图像合并;在这里获得该区域是关键。
  • 然后您可以将该图像设置为背景图像或将其绘制到移动器上。

  1. 另一个问题是移动代码。这里的问题是,当您移动鼠标时,会触发MouseMove事件,并且可以移动控件。但是通过移动鼠标,鼠标将相对移动到新位置,并且事件将再次触发,从而导致闪烁!

为避免这种情况,您可以测试数字,或者使用标志取消注册移动事件,然后再设置位置并随后重新注册。

也可以一次性设置位置而不是两个坐标。.:button.Location = new Point(button.Left + e.X - MouseDownLocation.X, button.Top + e.Y - MouseDownLocation.Y);


Imo,您仍然应该考虑仅在On panel.MouseMovepanel.Paint上绘制图形。在panel.MouseUp上,您仍然可以在此处的Button上添加一个panel.Controls。避免了这两个问题,您也可以自由添加所需的功能。