2009-07-09 35 views
1

我有一個C++/CLI System::Windows::Forms::UserControl派生的控制,它應該只是重新繪製(一小部分)本身,因爲新的數據被送入它。出於某種原因,OnPaint機制即使在沒有任何內容導致它在應用程序外部被調用時也是如此。如何阻止System :: Windows :: Forms :: UserControl擦除背景?

這裏有一個片段:

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

因此,我調用add數據的方法增加理論上應該寫在一個條目(這將清除一些突出),並寫入新的條目一些新的數據。

早在我用來開發MFC/OpenGL應用程序的時候,我會做的第一件事就是覆蓋OnEraseBackground方法。據我所知,沒有明顯的辦法可以阻止它被抹去。我錯過了什麼?

回答

5

您可能正在尋找Control.OnPaintBackground()。我不得不重寫那些我爲寫一個自定義控件而將一個遺留MFC控件帶入一個Wi​​nforms項目的任何事情。否則,它會在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; 

被到您通過事件參數傳遞什麼矩形?整個控件是無效的,還是隻是其中的一部分?

4

也許是這樣的形態的構造函數聲明:

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

我認爲,防止OnPaintBackground被調用的所有:所以你並不需要重寫OnPaintBackground,而是可以擦除背景(或不)您自己的OnPaint

+1

+1:我剛剛測試過,你說得對,設置停止背景被刪除 - 我希望我可以接受這兩個答案! – 2009-07-10 08:22:37

+0

+1:酷,不知道那個。 :) – 2009-07-10 10:50:47

0

我最近在OnPaint上做了一些事情(如果有問題的話),我注意到當控件的某個區域被顯示時,它就會被繪製出來。

一個更好的解決方案是繪製一個緩存的位圖,並在每次dotNet要求時將其繪製到控件中。

相關問題