C# 图形在绘图之前转换内容

C# 图形在绘图之前转换内容,c#,winforms,graphics,gdi+,draw,C#,Winforms,Graphics,Gdi+,Draw,我有以下问题:我正在绘制一个高资源实时图。我在主循环中获取一个浮点值,并希望将该值绘制到现有的实例结构(它是表单的图形实例)。 为此,我必须将整个图形内容在x方向上平移1,以绘制新点。问题是,翻译似乎影响了新的观点,而不是现有的内容 代码(简称)如下所示: float oldval = 0; Graphics gr = this.CreateGraphics(); public void IndependentThread(...) { float h = (float)this.H

我有以下问题:我正在绘制一个高资源实时图。我在主循环中获取一个浮点值,并希望将该值绘制到现有的实例结构(它是表单的图形实例)。
为此,我必须将整个图形内容在x方向上平移1,以绘制新点。问题是,翻译似乎影响了新的观点,而不是现有的内容

代码(简称)如下所示:

float oldval = 0;
Graphics gr = this.CreateGraphics();

public void IndependentThread(...)
{
    float h = (float)this.Height;
    Pen p = Pens.Pink;

    while (condition_to_exit_loop)
    {
        float current = 0;

        this.Invoke(new MethodInvoker(() => current = getVal())); //<-- funtion witch fetches the current value

        gr.TranslateTransform(1, 0); //<--- I want to translate the existing content - not the new one
        gr.DrawLine(p, 0, h * current, 1, h * oldval);

        oldval = current;
    }
}
float oldval=0;
Graphics gr=this.CreateGraphics();
public void独立线程(…)
{
浮动h=(浮动)此高度;
钢笔p=钢笔。粉红色;
while(条件到退出循环)
{
浮动电流=0;

this.Invoke(new MethodInvoker(()=>current=getVal());//听起来好像您相信
Graphics
类实际上包含图形。它不包含图形。它只是用于在位图上绘制的对象!(在您的示例中,
this
,不管是什么,
表单还是类……)存在很多问题。CreateGraphics是错误的:最小化窗体并还原它将删除所有内容。您需要重写窗体的OnPaint方法并使用提供的图形。在这里,您可以重新绘制所有点,或者更新位图并将结果绘制到窗体。您的线程将导致s出现问题结束对表单的太多更新。最好使用计时器。在
图形
对象上设置的变换会影响其后的绘图命令,而不是已绘制的内容。改变逻辑,从一开始就将内容绘制到正确的位置,而不是稍后再尝试移动。此外,因为您似乎只需要绘制单线,只需更改这些线的坐标,而不必处理变换。从另一个线程绘制这样的线似乎是一个非常糟糕的主意。我首先使用了计时器,但速度不够快(即使使用.Interval=1;)对于显示和感知而言,任何超过20毫秒的速度都太快。-对于最快的绘图,请使用优化的绘图代码,例如,收集几行并使用绘图线(复数)。还可以决定是要实时绘图还是要绘制到持久位图中。(有关这两个选项,请参阅!)应用程序以全屏模式运行,因此最小化不会是一个错误的问题。在许多其他情况下,非持久性图形会被破坏,例如弹出窗口、消息框等。无论发生什么情况,都要避免使用它。(除了短暂的鼠标装饰)-即使我重写了绘制方法-我也会遇到与以前相同的问题,不是吗?对。因此,您必须通过收集图形数据并在需要时刷新图形,或者通过将图形绘制到persistet位图来解决此问题。。