【问题标题】:Drawing Framework in C# to avoid flickering在 C# 中绘制框架以避免闪烁
【发布时间】:2014-11-27 02:45:38
【问题描述】:

我刚刚开始学习 C#,我想就绘画方面的良好做法寻求建议,以避免闪烁。

我已经使用了这里提到的方法,例如双缓冲和打开WS_EX_COMPOSITED,但适合我的方法是:

拨打PaintEventHandler

this.dgData.Paint += new System.Windows.Forms.PaintEventHandler(this.myPaint);

并使用PaintEventArgs 进行绘制:

private void myPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    Graphics myGraphics = e.Graphics;
    // Use myGraphics to draw
}

并且PaintEventHandler 是通过Refresh() 上的Timer 触发的。

private void TimerElapsed(object sender, System.EventArgs eventArgs)
{
    Refresh();
}

但是,我担心这种绘制方式需要我为表单上的每个控件提供PaintEventHandler

因此,我想问一下是否有更优雅的方式来实现这一点。

谢谢!

【问题讨论】:

  • 如果您手动绘制控件,则每个控件都需要一个绘制事件处理程序,是的。这是什么类型的应用程序?你遇到什么样的闪烁?
  • 你的代码.Paint += ...实际上是订阅控件的绘制事件,当控件绘制时执行处理程序;如果您要绘制自定义控件,您应该覆盖它的OnPaint 方法。它们是不同的。
  • @Blorgbeard 基本上,该应用程序捕获一个实时数据集(大约每秒几百个点)并将其显示为图表。我的闪烁问题包括显示附加信息的列表框闪烁。
  • @kennyzx 我想要做什么:我有一个 DataGridView 控件。我正在尝试在此控件上绘画(带有点和线的图形)。这是否被视为自定义控件?
  • 双缓冲是解决方案。但是如何确保 all 渲染是在双缓冲的情况下完成的,这取决于您在此处未提供的实际代码。请提供一个好的代码示例:completeminimal。见stackoverflow.com/help/mcve

标签: c# winforms flicker paintevent


【解决方案1】:

我无法再告诉我在哪里找到了这段代码,但这是我为消除闪烁所做的:我在控件的构造函数中设置了这些样式:

public partial class MyControl : Control
{    
    public MyControl()
    {
        InitializeComponent()
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        SetStyle(ControlStyles.ResizeRedraw, true);
        SetStyle(ControlStyles.UserMouse, true);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多