C# 背景面板窗口窗体

C# 背景面板窗口窗体,c#,winforms,C#,Winforms,我希望你能帮助我解决这个问题,附上视频以更简单的方式解释 带有标签的面板(具有纹理背景)(标签具有无背景的png图像) 事件:MouseDown、MouseUp和MouseMove。 正如您在拖动标签的视频中所注意到的,当我停止拖动标签时,背景将变为白色面板并恢复其背景图像 面板控件有一个透明的背景作为属性,但改变背景的任何颜色,让问题发生相关的物质,我不明白为什么会发生这种情况,以及如何修复较少 包含上述内容,唯一的区别是面板控制而不是透明背景,我为该属性选择了黑色您必须使用双缓冲区,并且

我希望你能帮助我解决这个问题,附上视频以更简单的方式解释

带有标签的面板(具有纹理背景)(标签具有无背景的png图像) 事件:
MouseDown
MouseUp
MouseMove
。 正如您在拖动标签的视频中所注意到的,当我停止拖动标签时,背景将变为白色面板并恢复其背景图像

面板控件有一个透明的背景作为属性,但改变背景的任何颜色,让问题发生相关的物质,我不明白为什么会发生这种情况,以及如何修复较少


包含上述内容,唯一的区别是面板控制而不是透明背景,我为该属性选择了黑色

您必须使用双缓冲区,并且您不必停止在背景上使用图像,您可以让一切顺利运行

有两种方法可以做到这一点,快速的方法(大部分时间不够)是启用面板的
doublebuffer

“慢”但更好的方法是使用位图对象作为缓冲区来执行自己的双缓冲区。 本例创建“侧缓冲区”,并接受图像作为参数,并使用创建的缓冲区绘制图像

public void DrawSomething(Graphics graphics, Bitmap yourimage)
{
    Graphics g;
    Bitmap buffer = new Bitmap(yourimage.Width, yourimage.Height, graphics);
    g = Graphics.FromImage(buffer);
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

    g.DrawImage(yourimage, 0, 0);

    graphics.DrawImage(buffer, 0, 0);
    g.Dispose();
}
在您的OnPaint活动中调用此选项

顺便说一句。。。这只是一个双缓冲区示例


欢呼声

将窗体和面板的DoubleBuffered更改为true。我认为这应该可以解决您的问题。

这是完全正常的,因为基于
系统.Windows.Forms.Control
的项目并不是设计用来执行这种高级图形操作的。 事实上,在这里发生这种效果的原因是,当您将255以外的任何值指定给控件的alpha组件
BackColor
,当您更改控件大小或位置时,表单会执行以下操作:

  • 它设置了新的控制位置
  • 它会重新绘制父控件
  • 它以图像的形式获取控件父级的背景
  • 它将获取的图像绘制到控件体中,使控件看起来像是透明的
  • 控件主体在先前绘制的背景上绘制
  • 将绘制控件子对象
  • *这是一个简化的解释,目的是为了举例说明该想法

    步骤1、2是您看到的闪烁效果的原因

    但是你有两种方法来解决这个问题

    -第一个是某种高级解决方案,但它非常强大,即必须创建一个双缓冲自定义控件作为视口

    • 第二种方法是使用WPF而不是windows窗体,因为WPF正是为了做这类事情而设计的
    如果你能提供一些代码,我可以告诉你如何做到这两个