次のことを試してください。
- 新しいVC++WinFormsアプリケーションを起動します。
- 「スペクトログラム」という名前のユーザーコントロールをプロジェクトに追加します
- 'Spectrogram'ユーザーコントロールにタイマーコントロールを追加し、'Enabled'プロパティをtrueに設定します
- 次のプライベート変数を「スペクトログラム」ユーザーコントロールに追加します
private:
Graphics ^m_gfxBuffer;
Graphics ^m_gfxOriginal;
Bitmap ^m_bmpBuffer;
Bitmap ^m_bmpOriginal;
- 次のコードを「スペクトログラム」コンストラクターに追加します。
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);
- プロジェクトを保存します
- クリーンアップして再構築
- プロジェクトを実行する
- 実行中のフォームを閉じる
- これで、スペクトログラムのユーザーコントロールが「ツールボックス」に表示されます。
- それを「ツールボックス」からフォームにドラッグすると、ランダムな色のスペクトログラムがスクロールして表示されます。
これにより、ビットマップバッファコントロールの概要がわかります。ここで重要なのは、コンストラクターでの「SetStyle」呼び出しと、paintイベントでのビットマップの-1によるオフセットです。
グラフィックスとビットマップオブジェクトを適切に破棄し、サイズ変更イベントでそれらを破棄して再構築する必要があります。
お役に立てれば。どうなるか教えてください。