2009-07-09 7 views
1

Ich habe eine C++/CLI System::Windows::Forms::UserControl abgeleitete Kontrolle, die nur einen kleinen Teil von sich selbst neu zeichnen sollte, wie neue Daten in es eingezogen werden. Aus irgendeinem Grund wird der OnPaint-Mechanismus auch dann aufgerufen, wenn nichts außerhalb der App geschieht.Wie kann ich verhindern, dass System :: Windows :: Forms :: UserControl den Hintergrund löscht?

Hier ist ein Ausschnitt:

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(); 
} 

So nenne ich das Add-Daten Methode einige neue Daten hinzufügen, die über den vorherigen Eintrag in der Theorie Schreib sollte (die eine gewisse Markierung löscht) und den neuen Eintrag schreiben.

Damals habe ich MFC/OpenGL-Apps entwickelt und eines der ersten Dinge, die ich tun würde, wäre, die OnEraseBackground Methode zu überschreiben. Soweit ich das beurteilen kann, gibt es keinen offensichtlichen Weg, die Löschung zu stoppen. Was habe ich verpasst?

Antwort

5

Sie können nach Control.OnPaintBackground() suchen. Ich musste dies überschreiben, um nichts für ein benutzerdefiniertes Steuerelement zu tun, das ich geschrieben habe, um ein Legacy-MFC-Steuerelement in ein Winforms-Projekt zu bringen. Sonst würde es den Hintergrund über den Lackauftrag des MFC-Steuerelements malen.

Wesentlichen in der 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. 
} 

Auf dem Prototyp:

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

Welche Rechteck in Ihnen wird über die Veranstaltung args? Wird das gesamte Steuerelement ungültig oder nur ein Teil davon?

+0

+1: Das ist exzellent - genau das, was ich gesucht habe. –

+0

Eine Sache noch zu erinnern; stellen Sie sicher, dass Sie Double-Buffering deaktiviert haben, oder die Puffer werden gelegentlich alles austauschen und löschen. –

+0

Oh, und es wurde die gesamte Kontrolle ungültig gemacht. –

4

Vielleicht ist es eine Aussage wie dies in Form Konstruktor:

//do own background painting 
this.SetStyle(ControlStyles.Opaque, true); 

Ich denke, dass verhindert OnPaintBackground überhaupt aufgerufen wird: Sie müssen nicht OnPaintBackground, außer Kraft zu setzen und stattdessen können Sie den Hintergrund löschen (oder nicht) selbst in Ihrem OnPaint.

+1

+1: Ich habe gerade getestet und du hast recht, Einstellung, die den Hintergrund aufhört zu löschen - ich wünschte, ich könnte beide Antworten akzeptieren! –

+0

+1: Cool, wusste nicht darüber. :) –

0

Ich habe in letzter Zeit einige Sachen mit dem OnPaint gemacht (C#, wenn das wichtig ist), und ich bemerkte, dass es buchstäblich gezeichnet wird, wenn ein Bereich der Kontrolle enthüllt wird.

Eine bessere Lösung ist es, auf eine zwischengespeicherte Bitmap zu zeichnen und sie jedes Mal auf das Steuerelement zu zeichnen, wenn dotNet danach fragt.

Verwandte Themen