Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 如何在C+中以每秒25帧的速度更新面板上的图形+/CLI/Windows窗体?_Winforms_C++ Cli - Fatal编程技术网

Winforms 如何在C+中以每秒25帧的速度更新面板上的图形+/CLI/Windows窗体?

Winforms 如何在C+中以每秒25帧的速度更新面板上的图形+/CLI/Windows窗体?,winforms,c++-cli,Winforms,C++ Cli,我的应用程序从外部硬件接收数据并将其打印到面板上(实际上可以是“控制”的任何其他子级)。绘制当前在“OnPaint”回调中进行。列表用于存储最近接收到的数据,以允许在OnPaint中重新绘制整个图形,以便在窗口调整大小等情况下获得正确的比例 图形本身是使用e->Graphics元素在两个数据点之间绘制的 这工作正常,但当我每50毫秒有新数据(重新绘制整个图形)时,图形很快开始闪烁。需要绘制的数据越多,闪烁就越强烈(当到达控件右侧时,数据缓存被清除,因此图形中的数据点的最大数量是有限的) 我的代码

我的应用程序从外部硬件接收数据并将其打印到面板上(实际上可以是“控制”的任何其他子级)。绘制当前在“OnPaint”回调中进行。列表用于存储最近接收到的数据,以允许在OnPaint中重新绘制整个图形,以便在窗口调整大小等情况下获得正确的比例

图形本身是使用
e->Graphics
元素在两个数据点之间绘制的

这工作正常,但当我每50毫秒有新数据(重新绘制整个图形)时,图形很快开始闪烁。需要绘制的数据越多,闪烁就越强烈(当到达控件右侧时,数据缓存被清除,因此图形中的数据点的最大数量是有限的)

我的代码的主要部分:

void Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)
{
    Size^ s = m_Control->Size;
    Bitmap^ bmp = gcnew Bitmap(s->Width, s->Height);
    Graphics^ g = Graphics::FromImage(bmp);

    for each(double y in m_Data)
    {
        /* ...calculations etc... */
        g->DrawLine(Pens::Blue, recentX, recentY, currentX, currentY);
    }           

    e->Graphics->DrawImageUnscaled(bmp, 0, 0);
}

有什么建议我可以优化绘画以消除闪烁吗?提前谢谢

独立于您的平台或语言,这类问题主要通过一种称为控制帧速率的方法来解决

您将调用绘制方法,然后估计在绘制上花费的时间。现在,您知道在一个步骤中花费了多少时间,以及您的茶点间隔有多长——在您的情况下是40毫秒。您可以使线程休眠(间隔-timespent)毫秒


顺便说一句,这是我的第一个答案,我知道我在解释东西方面很糟糕。

闪烁来自WinForms在调用绘图处理程序之前擦除背景


您需要编写自己的自定义控件继承自面板,并重写
OnPaintBackground
以不执行任何操作(尤其是,不要调用基类版本)。

在表单构造函数中,将this->DoubleBuffered属性设置为true。简单易行。@Hans:是的,但那不应该放在面板上而不是表格上吗?而现有的代码已经是双缓冲的…尝试访问面板上的“双缓冲”会引发错误,但不确定原因@HansPassant谢谢你,这让它变得更好了,但并没有解决问题。在搜索框中键入“BufferedPanel”。@HansPassant哇,谢谢,你对这个问题的回答对我很有帮助!谢谢,这很有效。但是当窗体调整大小时,奇怪的事情就会发生,因为背景不再被重新绘制。知道我如何解决这个问题吗?@Niko:根据您提供的代码,您正在创建一个控件大小的位图,并将其复制到控件作为最后一步。所以你看到的任何垃圾都来自于位图。或者你是说形式背景本身不是绘画?我只是建议在面板上短路
OnEraseBackground
,而不是整个表单。太好了,谢谢!用白色填充位图的背景解决了垃圾问题。