3

パネルに線を引き、マウスの動きに合わせて線を動かしたい。そのためには、線を描画し、マウスを動かしたときに線を新しい場所に再描画し、背景色の線を描画して前の線を削除します。高品質のスムージングモードを使用しない場合は正常に機能します。ただし、高品質のスムージングモードを使用すると、パネルに痕跡が残ります。誰かがこれを修正する方法を知っていますか?ありがとうございました。これがコードです

        int x_previous = 0;
        int y_previous = 0;

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            Pen pen1 = new System.Drawing.Pen(Color.Black, 3);
            Pen pen2 = new System.Drawing.Pen(panel1.BackColor, 3);
            Graphics g = panel1.CreateGraphics();
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.DrawLine(pen2, new Point(0, 0), new Point(x_previous, y_previous));
            g.DrawLine(pen1, new Point(0, 0), new Point(e.Location.X, e.Location.Y));
            x_previous = e.Location.X;
            y_previous = e.Location.Y;
        }

これがSmoothingModeのスナップショットです

結果のスナップショット

これがSmoothingModeなしのスナップショットです

結果のスナップショット

4

3 に答える 3

1

線の上に線を引く代わりに、最も安全なオプションは、を使用してグラフィックをクリアすることg.Clear(panel1.BackColor)です。これにより、描画されたものがすべて消去されるため、新しい線を安全に描画できます。

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Pen pen1 = new System.Drawing.Pen(Color.Black, 3);
    Pen pen2 = new System.Drawing.Pen(panel1.BackColor, 3);
    Graphics g = panel1.CreateGraphics();
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    // Clear the graphics, creating a blank area to draw on
    g.Clear(panel1.BackColor);
    g.DrawLine(pen1, new Point(0, 0), new Point(e.Location.X, e.Location.Y));
    x_previous = e.Location.X;
    y_previous = e.Location.Y;
}

お役に立てれば!

于 2012-11-12T04:40:21.380 に答える
1

マウスの動きのイベントハンドラーで線を描画する代わりに、それを使用してパネルを無効にし、 Paintイベントのハンドラーで線の描画を実行する必要があります。古い行を消去する必要はありません。

于 2012-11-12T04:57:28.857 に答える
0

私はしばらくWinFormsを使用していないので、これが機能しない場合はご容赦ください。

アンチエイリアシングによって線のエッジがわずかにぼやけて、最初の線がペンの幅よりもわずかに外側に伸びていると思います。これは、黒い線の上に描画するときに白いペンのエッジが完全に不透明にならないことも意味します。

白ペンの幅を黒を完全に覆うまで増やしてみてください。おそらく、白ペンのレンダリングの品質を下げてGraphicsオブジェクトを残し、黒ペンにのみスムージングを使用できるかどうかを確認してください。

于 2012-11-12T03:59:35.140 に答える