Попробуйте следующее:
- Запустите новое приложение VC ++ WinForms.
- Добавить пользовательский элемент управления «Спектрограмма» в проект
- Добавить элемент управления таймером в пользовательский элемент управления «Spectrogram» и установить для свойства «Enabled» значение true
- Добавить следующие личные переменные в пользовательский элемент управления «Spectrogram»
private:
Graphics ^m_gfxBuffer;
Graphics ^m_gfxOriginal;
Bitmap ^m_bmpBuffer;
Bitmap ^m_bmpOriginal;
- Добавьте следующий код в конструктор Spectrogram:
m_bmpBuffer = gcnew Bitmap(this->ClientSize.Width, this->ClientSize.Height);
m_gfxBuffer = Graphics::FromImage(m_bmpBuffer);
m_bmpOriginal = gcnew Bitmap(this->ClientSize.Width, this->ClientSize.Height);
m_gfxOriginal = Graphics::FromImage(m_bmpOriginal);
this->SetStyle(::ControlStyles::AllPaintingInWmPaint | ::ControlStyles::DoubleBuffer | ::ControlStyles::UserPaint | ::ControlStyles::OptimizedDoubleBuffer, true);
this->UpdateStyles();
- Добавьте следующий код в событие рисования «Спектрограмма»:
array<unsigned char, 1> ^bytes = gcnew array<unsigned char, 1>(m_bmpBuffer->Height * 3);
Random ^r = gcnew Random();
r->NextBytes(bytes);
m_gfxOriginal->DrawImage(m_bmpBuffer, -1, 0);
int y = 0;
for (int i = 0; i < m_bmpOriginal->Height * 3; i += 3)
{
m_bmpOriginal->SetPixel(m_bmpOriginal->Width - 1, y++, ::Drawing::Color::FromArgb(255, bytes[i], bytes[i + 1], bytes[i + 2]));
}
m_gfxBuffer->DrawImage(m_bmpOriginal, 0, 0);
e->Graphics->DrawImage(m_bmpOriginal, 0, 0);
- Добавьте следующий код для события отметки времени таймеров «Спектрограммы»
this->Invalidate(false);
- Сохранить ваш проект
- Очистить и восстановить
- Запустить проект
- Закрыть работающую форму
- Пользовательский элемент управления Spectrogram теперь должен быть в 'Toolbox'
- Перетащите его из «Панели инструментов» в форму, и вы увидите прокручивающуюся спектрограмму случайного цвета.
Это должно дать вам общее представление о буферизованном элементе управления растровым изображением. Ключевым моментом здесь является вызов "SetStyle" в конструкторе и смещение растрового изображения на -1 в событии рисования.
Вам нужно будет правильно распоряжаться графическими и растровыми объектами, а также обрабатывать их уничтожение и перестройку в событии изменения размера.
Надеюсь, это поможет. Дайте мне знать, как это происходит.