Как остановить System :: Windows :: Forms :: UserControl от стирания своего фона? - PullRequest
1 голос
/ 09 июля 2009

У меня есть 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();
}

Поэтому я вызываю метод add data длядобавьте некоторые новые данные, которые теоретически должны быть записаны поверх предыдущей записи (которая очищает некоторые выделения) и напишите новую запись.

В тот день, когда я использовал для разработки приложений MFC / OpenGL, и одной из первых вещей, которые ябыло бы переопределить метод OnEraseBackground.Однако, насколько я понимаю, нет очевидного способа остановить его удаление.Что я пропустил?

Ответы [ 3 ]

5 голосов
/ 09 июля 2009

Возможно, вы ищете 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.
}

По прототипу:

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

Какой прямоугольник передается вам через аргументы события? Является ли весь элемент управления недействительным или его частью?

4 голосов
/ 09 июля 2009

Может быть, это утверждение в конструкторе формы:

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

Я думаю, что это вообще не позволяет вызывать OnPaintBackground, поэтому вам не нужно переопределять OnPaintBackground, и вместо этого вы можете самостоятельно стереть фон (или нет) в вашем OnPaint.

0 голосов
/ 09 июля 2009

В последнее время я сделал кое-что с OnPaint (C #, если это имеет значение), и заметил, что он буквально рисуется, когда открывается область элемента управления.

Лучшее решение - рисовать на кэшированном растровом изображении и выводить его в элемент управления каждый раз, когда dotNet запрашивает его.

...