背景面板Windows窗体

本文关键字:窗体 Windows 背景 | 更新日期: 2023-09-27 17:50:47

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

第一个例子

面板(有纹理背景)与标签(标签有png图像没有背景)事件:MouseDownMouseUpMouseMove。正如你在视频中注意到的那样,当我拖动标签时背景变成白色面板并恢复其背景图像当我停止拖动标签

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

第二个例子

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

背景面板Windows窗体

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

您有几种方法可以做到这一点,快速的方法(大多数时候不够)是启用面板的doublebuffer

"慢"但更好的方法是使用Bitmap对象作为缓冲区来做你自己的Double Buffer。这个例子创建了一个"侧缓冲区",并接受一个图像作为参数,并使用创建的缓冲区绘制它。

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。我想这应该能解决你的问题。

这是完全正常的,因为基于System.Windows.Forms.Control的项目并不是为这种高级图形操作而设计的。实际上,这里发生这种效果的原因是,当您为控件BackColor的alpha组件赋值255以外的任何值时,当您更改控件的大小或位置时,窗体会执行以下操作:

  1. 设置新的控制位置
  2. 它重新绘制父控件
  3. 它以图像的形式获取控件父元素的背景
  4. 它将获取的图像绘制到控件体中,使控件看起来好像是透明的
  5. 控件主体被绘制在先前绘制的背景的顶部
  6. 控件子控件被绘制

*这是一个简化的解释,为了说明传递的想法

步骤1和步骤2负责你看到的闪烁效果。

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

-第一个是一些高级的解决方案,但它非常强大,你需要创建一个双缓冲的自定义控件,这将是你的视口。

  • 第二种是使用WPF来代替windows窗体,因为WPF正是为了做这种事情而设计的。

如果你能提供一些代码,我可以告诉你如何做到这两点。