尝试以下操作:
- 启动一个新的 VC++ WinForms 应用程序。
- 将名为“Spectrogram”的用户控件添加到项目中
- 将计时器控件添加到“频谱图”用户控件并将“启用”属性设置为 true
- 将以下私有变量添加到“频谱图”用户控件
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();
- 将以下代码添加到“Spectrogram”绘制事件中:
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);
- 保存您的项目
- 清理和重建
- 运行项目
- 关闭正在运行的表单
- 频谱图用户控件现在应该在“工具箱”中
- 将它从“工具箱”拖到表单中,您应该会看到一个滚动的随机彩色频谱图。
这应该让您大致了解位图缓冲控件。这里的关键是构造函数中的“SetStyle”调用和绘制事件中位图的偏移量-1。
您必须正确处理图形和位图对象,并在调整大小事件中处理销毁和重建它们。
希望这可以帮助。让我知道事情的后续。