Graphics 如何阻止System::Windows::Forms::UserControl擦除它';她有什么背景?

Graphics 如何阻止System::Windows::Forms::UserControl擦除它';她有什么背景?,graphics,user-controls,c++-cli,Graphics,User Controls,C++ Cli,我有一个C++/CLI系统::Windows::Forms::UserControl派生控件,当新数据输入时,该控件应该只重新绘制(一小部分)自身。然而,出于某种原因,即使在应用程序外部没有任何原因导致OnPaint机制被调用 下面是一个片段: void Spectrogram::OnPaint(System::Windows::Forms::PaintEventArgs ^e) { // Overidden to stop the background being painted(?)

我有一个C++/CLI
系统::Windows::Forms::UserControl
派生控件,当新数据输入时,该控件应该只重新绘制(一小部分)自身。然而,出于某种原因,即使在应用程序外部没有任何原因导致OnPaint机制被调用

下面是一个片段:

void Spectrogram::OnPaint(System::Windows::Forms::PaintEventArgs ^e)
{
    // Overidden to stop the background being painted(?)
}

void Spectrogram::AddNewFFTData( float* data, int fataWidth )
{
    Graphics^ gfx = CreateGraphics();

    //now do some drawing

    gfx->Dispose();
}
因此,我调用adddata方法来添加一些新数据,理论上,这些数据应该写在前面的条目上(清除一些突出显示),然后写新条目


回到我开发MFC/OpenGL应用程序的那一天,我要做的第一件事就是覆盖OnEraseBackground方法。就我所知,没有明显的方法可以阻止它被擦除。我遗漏了什么?

可能是表单构造函数中这样的语句:

//do own background painting
this.SetStyle(ControlStyles.Opaque, true);
我认为这完全可以防止调用
OnPaintBackground
:因此您不需要覆盖
OnPaintBackground
,相反,您可以自己在您可能要查找的
OnPaintBackground

中删除背景(或不删除)。我必须重写它,以便对我编写的自定义控件不做任何操作,以便将遗留MFC控件引入Winforms项目。否则,它将在MFC控件的绘制作业上绘制背景

基本上,在.cpp中:

void MyControl::OnPaintBackground(System::Windows::Forms::PaintEventArgs ^pevent)
{
    // Do nothing, we don't want to paint over the native control.
    // You may want to do something a little fancier for DesignMode
    // if you use the winforms designer, though.
}
关于原型:

protected: 
    void virtual OnPaintBackground(System::Windows::Forms::PaintEventArgs ^pevent) override;

通过事件参数传递给您的是哪个矩形?整个控件是无效的,还是只是它的一部分?

我最近用OnPaint做了一些事情(如果有关系的话,用C#),我注意到当控件的某个区域显示出来时,它实际上是被画出来的


更好的解决方案是在缓存的位图上绘制,并在每次dotNet请求时将其绘制到控件。

+1:我刚刚测试过,你说得对,设置停止擦除背景-我希望我能接受这两个答案!还有一件事要记住;请确保您已禁用双缓冲,否则缓冲偶尔会交换和擦除所有内容。哦,整个控件都将失效。太棒了,我很高兴这有帮助。:)我只是想知道什么是无效的,因为这可能是导致无效的线索。