0

私はここで初めてですが、私の問題をできるだけ明確に説明しようとします。垂直スクロールバーと水平スクロールバーのあるフォームに赤い点を配置しています。ドットを配置(50,590)して右にスクロールすると、ドットが動きに「追従」します。

まだ画像を投稿できませんが、それらへのリンクを投稿できます。最初の画像は元の位置のドット、2 番目の画像は右の ドットの元の位置に スクロールした後のドット、スクロール後のドットです。

スクロール時にドットが元の位置を維持するようにしたいのですが、実際にはまだ理解していない間は理解できません。

これがコードです

Bitmap MyBitmap = new Bitmap(3000,3000);

Graphics MyGraphicObject;

Brush red = new SolidBrush(Color.Red);

private void Form1_Paint(object sender, PaintEventArgs e)
{
     MyGraphicObject = e.Graphics;
     MyGraphicObject.DrawImage(MyBitmap, 0, 0, MyBitmap.Width, MyBitmap.Height);
     MyGraphicObject.Dispose(); 
}

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
     MyGraphicObject = Graphics.FromImage(MyBitmap);
     MyGraphicObject.FillRectangle(red, e.X-2, e.Y-2, 4, 4);
}

この問題を解決するのを手伝ってもらえますか?

4

1 に答える 1

0

「ドラッグ中にウィンドウの内容を表示する」という組み込みの Windows 設定があり、すべての最新バージョンの Windows でデフォルトでオンになっています。スクロールすると、スクロールバーのあるウィンドウのコンテンツが自動的に移動します。また、以前は表示されていなかったウィンドウの部分のペイント要求のみを生成します。

これが、ビットマップが動いているように見える理由です。ウィンドウの一部だけでなく、ウィンドウ全体を強制的に再描画して修正する必要があります。このコードをフォーム クラスに貼り付けます。

    protected override void OnScroll(ScrollEventArgs se) {
        base.OnScroll(se);
        this.Invalidate(false);
    }

これで問題が解決し、ビットマップが同じ位置に再描画されます。ただし、Windows 設定のアーティファクトが表示されないわけではありません。ビットマップがスクロールされた位置に一瞬表示されます。視覚効果は、ビットマップがポゴを実行しているのを見るのと似ています。そのための修正はありません。ダブルバッファリングでは修正できず、その設定を合理的にオフにすることはできません。

ところで、コードのバグを修正してください。グラフィックス オブジェクトを破棄しないでください。あなたはそれを作成しませんでした。これは、将来、ダブルバッファリングをいじり始めるときに問題を引き起こします。その発言を削除します。

于 2012-12-17T12:36:38.227 に答える