背景面板Windows窗体

时间:2014-03-18 18:50:10

标签: c# winforms

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

First example

面板(带纹理背景)带标签(标签有png图像,没有背景) 活动:MouseDownMouseUpMouseMove。 正如您将在视频中注意到拖动标签时背景变为白色面板并在我停止拖动标签时重新获得其背景图像

面板控件具有透明背景作为属性,但是用任何颜色改变背景,让问题发生与实质相关,我不明白为什么会发生这种情况以及如何解决更少问题。

Second Example

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

3 个答案:

答案 0 :(得分:0)

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

你有几种方法可以做到这一点,快速的方式(大部分时间不够)是启用面板的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事件中调用此方法。

BTW ......这只是一个双缓冲的例子。

干杯

答案 1 :(得分:0)

将表单和面板的DoubleBuffered更改为true。我认为这应该可以解决你的问题。

答案 2 :(得分:0)

这是完全正常的,因为基于System.Windows.Forms.Control的项目并非旨在执行这种高级图形操作。 实际上,此效果在这里发生的原因是,当您为控件BackColor的alpha分量分配除255之外的任何值时,当您更改控件的大小或位置时,表单会执行以下操作:

  1. 它设置新的控制位置
  2. 它重绘了父控件
  3. 它以图像的形式获取控件父级的背景
  4. 它将获取的图像绘制到控件主体中,看起来好像控件是透明的
  5. 控件主体被绘制在先前绘制的背景之上
  6. 绘制对照子项

*这是一个简化的说明,目的是为了说明该想法

步骤1、2负责您看到的闪烁效果。

但是您有两种解决方法,

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

  • 第二种方法是使用 WPF 而不是Windows窗体,因为 WPF 正是为执行这种操作而设计的。

如果您能提供一些代码,我可以向您展示如何做到这两种方式。