Graphics 如何阻止System::Windows::Forms::UserControl擦除它';她有什么背景?
我有一个C++/CLIGraphics 如何阻止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(?)
系统::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:我刚刚测试过,你说得对,设置停止擦除背景-我希望我能接受这两个答案!还有一件事要记住;请确保您已禁用双缓冲,否则缓冲偶尔会交换和擦除所有内容。哦,整个控件都将失效。太棒了,我很高兴这有帮助。:)我只是想知道什么是无效的,因为这可能是导致无效的线索。