2

C#GDI+を使用してカスタムコントロールを作成しています。

簡単な説明...コントロールは画面上で500ピクセルと表示されますが、おそらく500000ピクセルの情報が含まれます。したがって、一度に500pxしか表示していませんが、明らかに水平面(左右)をスクロールする必要があります。トリッキーな部分は、ビットマップの各500pxチャンクがレンダリングするのに時間がかかることです(100msから1000msの間)。

だから私の計画はメモリに1500pxのビットマップを維持することです。つまり、500pxの表示部分と表示領域の両側に500pxがあり、ユーザーがスクロールすると画面外の部分が非同期に描画されます。

これを達成するのに役立つフィードバック、アドバイス、批評、またはコードの例をお願いします。かなり簡単に思えますが、最初のテストを数回試みた後、その証明は想像以上に困難でした。

ありがとう。

4

3 に答える 3

1

私は数年前に同様の問題を抱えていました。dommerが述べているように、画像のチャンクを表示する前に処理している場合は、何かを表示して後で改善するのが最善です。元の画像のブリットに問題がある場合は、メソッドに問題があります。GDI +はピクセル深度に非常にこだわっています(アルファ付きの32bppが必要です)。

この例では、500pxのタイルで処理し、表示されているビューの周囲にタイルをパディングしました。ユーザーが処理した領域の外側をスクロールすると、元の画像の一部に暗い半透明の長方形が重ねて表示されます。これらのチャンクは処理のためにキューに入れられました。画像のチャンク(中央)を処理すると、半透明の長方形が消えます。

それは適度にうまく機能し、非常に応答性が高く、非常に高速でした。元のビットマップを画面にブリットするのは非常に高速であり、私たちの場合、処理は通常非常に遅れていました。タイルが軽くなる効果は、実際にはかなりきれいでした。

于 2009-04-07T20:10:27.950 に答える
1

可視領域のみを描画します。メソッドを構築する

Bitmap DrawGraph(leftMargin, rightMargin) {...}

そして、OnPaint()行う

Bitmap bmp = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);
bmp = DrawGraph(e.ClipRectangle.Left, e.ClipRectangle.Right);

e.Graphics.DrawImageUnscaled(bmp, e.ClipRectangle.Location);
于 2010-07-20T16:29:07.523 に答える