どのように書き込み(ビットマップ?) イメージバッファによりGDI+を表示?

StackOverflow https://stackoverflow.com/questions/1055920

質問

C++、.純ってストリームのデータを表示したいとしてスクロールイメージです。たく新しいデータを追加したいので、新しい行として(128x1ピクセル)のスクロールの前のコンテンツの一側となります。

私の最初の刺しのに関する問題をレンダリング全体のデータセットは毎回新しいです。この手があまりにも遅く、思いがあまり書き込みバッファーの一部のソート(ビットマップか?).問題は見えないことに気づいたかそれを実行でき; Graphic オブジェできなくもないでは明らかく私の制御に使用 Bitmap オブジェクトとしてこのバッファ?同様に、見えないことに気づいために描きのビットマップが一時的に保存してからの画面になります。

これは可能ですが、私のgoogle-fooに失敗したいこ...

[Edit1] かめのデータはスペクトログラム.以下の図のようなものでしたを実現しようとしてい:

altテキストhttp://www.geekops.co.uk/photos/0000-00-02%20(Forum%20images)/ScrollingGraphicsAlgorithmExplanation.png

データのんのプロット付き配列をfloat.あの制限はどれくか、また支えていただいた多くの方を忘れてのデータとしても下の側面。

私は、現在の継承から System::Windows::Forms::UserControl, ることが可能になスイッチになっても、他のものがあればより良い代わ?

役に立ちましたか?

解決

ScrollWindow win32方法です。スクロールすることができ、既存のデータの画面でそのときのみ、新しいデータです。この 非常に 早いです。

他のヒント

ビットマップbmpImage=新たなビットマップ(512,512);

for(int iRow=0;iRow < 512;iRow++)

{

  for (int iCol = 0; iCol <512; iCol++)
                        {
                            Color clr;
                            bmpImage.SetPixel(iCol, iRow, clr);
                        }

}

(イメージ)bmpImage.save()

可能な戦略

  • 描backbuffer左から右にあるラップが到達します。行のスクロールロジックだけを塗る場合に画面で指定されたframerate).利用DrawImageソースの矩形先の矩形です。

  • 使用ビットマップ.LockBits(...)およびビットマップ.UnlockBits(...)の方法の変更の原ビットマップデータを表します。に付着しないようにしてくださいみロックは矩形すが、これらの機能を実際にこのビットマップからのデータポリシーを管理します。る方法について、例を挙げないことについてはこちらをご覧下さい ビットマップ..::.LockBits方法(矩形ImageLockModeフォーマット).

  • 代替LockBitsはSetPixelのビットマップ.がSetPixelを知るにはログインが必要です。

  • がblit転送の画像を画面いCompositingModeラフィックスのインスタンスに設定さbmpg.CompositingMode=CompositingMode.SourceCopyは、ピクセルフォーマットのバックバッファはPixelFormat.Format32bppPArgb.

いぶことになるでしょうか何をしようとしているこうにある種の制御ダイアログを?) はんだ作業のようなもの:

class Foo {
    ...
    Gdiplus::Bitmap* m_pBitmap;
};

void Foo::DrawItem(LPDRAWITEMSTRUCT lpDraw) {

   // update bitmap if needed
   if(some_condition_requiring_bitmap_redraw) {

       // do expensive drawing into bitmap
       Gdiplus::Graphics graphics(m_pBitmap);
   }


   // create a graphics object to draw the control from the bitmap
   Gdiplus::Graphics graphics(lpDraw->hDC);
   graphics.DrawImage(m_pBitmap, ...);
}

ことになると思います。のDrawItemも見た目は全く違います。純(私は知らないので...)が、基本的な論理に必要約と同じです。

のようにお客様のデータはできない場合があり効率的に描き1ピクセル行ます。きより良いオフを描画す大きな面積を示すビットとして必要な-はるかに依存データでアウトソースしましょう。

まだけでなくようなデビットマップの"スクロール"。だるまです:-)

次のことを試してみてください:

  • 新"VC++サポート。
  • ユーザーの追加を制御とされるスペクトログラムのプロジェクト
  • 追加タイマー制御のスペクトログラム"ユーザー制御の設定を'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"コンストラクタで呼び出し、オフセットのビットマップにより-1の描画イベントです。

また適正処理のグラフィックとビットマップオブジェクトと同様に取り扱破壊と復興のサイズの変更イベントです。

武器agiは、dexで下がらないboxerぐ.の流れを教えてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top