控制的背景图象窃听

问题描述 投票:0回答:1

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

image2

在Paint事件期间手动绘制移动控件上的图像:

    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

是为了让进展更顺畅吗?

谢谢。

这是在表单上移动我的triaxe的代码:

    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;
    }
c# image winforms transparency
1个回答
0
投票

让我们假设你不想单独绘制图形,但确实想要一个透明度的Control移动到另一个Control之上。

你必须解决两个问题:

  1. Winforms不能很好地支持透明度;你有两个选择: 让系统为你伪造它 或者自己做假。

对于第一个,使用透明背景和具有透明度的Image或BackgroundImage(取决于控件类型)的控件就足够了,然后将移动控件嵌套在背景控件中。

对于简单的测试,您可以将if (button.Parent != panel1) button.Parent = panel1;添加到您的mousedown代码中。这看起来很蠢,但应该正确显示透明度。 (不要忘记让Backcolor透明;在你的代码中你做它SystemColors.Control

要自己伪造它,你会完全按照系统的做法:

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

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

为避免这种情况,您可以在设置位置之前测试数字或使用标记或取消注册移动事件,然后重新注册。

同时设置位置而不是两个坐标是一个好主意..:MouseMove


Imo你仍然应该考虑在On button.Location = new Point(button.Left + e.X - MouseDownLocation.X, button.Top + e.Y - MouseDownLocation.Y);panel.MouseMove上绘制图形。在panel.Paint你仍然可以在那里添加panel.MouseUpButton。这两个问题都可以避免,您可以自由添加所需的功能。

© www.soinside.com 2019 - 2024. All rights reserved.