如何阻止System :: Windows :: Forms :: UserControl擦除它的背景?

Jon*_*age 1 graphics user-controls c++-cli

我有一个C++/CLI System::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();
}
Run Code Online (Sandbox Code Playgroud)

所以我调用add data方法添加一些新数据,这些数据理论上应该写入前一个条目(清除一些突出显示)并写入新条目.

在那天我曾经开发过MFC/OpenGL应用程序,我要做的第一件事就是覆盖这个OnEraseBackground方法.据我所知,没有明显的方法可以阻止它被删除.我错过了什么?

Chr*_*isW 5

也许在 Form 的构造函数中是这样的语句:

//do own background painting
this.SetStyle(ControlStyles.Opaque, true);
Run Code Online (Sandbox Code Playgroud)

我认为这完全可以防止OnPaintBackground被调用:因此您不需要覆盖OnPaintBackground,而是您可以自己在OnPaint.


Gre*_*g D 5

您可能正在寻找Control.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.
}
Run Code Online (Sandbox Code Playgroud)

在原型上:

protected: 
    void virtual OnPaintBackground(System::Windows::Forms::PaintEventArgs ^pevent) override;
Run Code Online (Sandbox Code Playgroud)

通过事件args传递给你的是什么矩形?整个控件是无效的,还是只是其中的一部分?