【发布时间】: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 渲染是在双缓冲的情况下完成的,这取决于您在此处未提供的实际代码。请提供一个好的代码示例:complete 和 minimal。见stackoverflow.com/help/mcve
标签: c# winforms flicker paintevent