【问题标题】:Background Panel Windows Form背景面板窗口窗体
【发布时间】:2014-03-18 18:50:10
【问题描述】:

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

First example

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

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

Second Example

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

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

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

    “缓慢”但更好的方法是使用 Bitmap 对象作为缓冲区来创建自己的双缓冲区。 此示例创建一个“侧缓冲区”并接受图像作为参数并使用创建的缓冲区进行绘制。

    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 事件中调用它。

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

    干杯

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        * 这是一个简化的解释,以说明表达想法

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

        但是你有两种方法可以解决这个问题,

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

        • 第二个是使用 WPF 而不是 windows 窗体,因为 WPF 就是专门为做这种事情而设计的。

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

        【讨论】:

          猜你喜欢
          • 2012-12-27
          • 2011-01-30
          • 1970-01-01
          • 1970-01-01
          • 2011-08-26
          • 2014-12-26
          • 1970-01-01
          • 2015-02-06
          • 1970-01-01
          相关资源
          最近更新 更多