0

シンプルなグラフィカル エディターを作成しようとしています。私は次の問題を抱えていSolidBrush()ます. 途切れのない曲線を取得する必要があります。これにマウスのキャプチャを使用しようとしましたが、機能しません(結果は同じです)。どうすれば修正できますか?以下の MouseMove イベント ハンドラのコードを見てください。

void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                pictureBox1.Capture = true; // I try to capture mouse here
                Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle);
                g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1);
            }
        }

ここに画像の説明を入力

4

3 に答える 3

0

マウスの移動の問題に加えて、ここには別のより深刻な問題があります。

グラフィックス サーフェス上で直接使用Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle)および描画すると、ピクセルが消えるため、一時的なものになります。

ボブ・パウエルもこれについて非常に良い答えを持っています.

GDI+ に関する最も多く寄せられた質問の第 1 位を参照してください: https://web.archive.org/web/20131226033137/http://bobpowell.net/picturebox.aspx

于 2012-10-25T18:31:28.443 に答える
0

代わりに、最後のマウス位置を覚えておいて、そこから現在のマウス位置まで線を引きます。

于 2012-10-21T10:51:43.307 に答える
0

マウスの移動速度によって異なります。MouseMove イベントが頻繁に発生する場合とそうでない場合があります。また、その特定の瞬間にマシンにどれだけ負荷がかかっているかにもよると思います。2 点間に線を引くと、曲線ではなく直線になります。代わりに、BeziersSplinesを確認する必要があります。そうすれば、いくつかの点に基づいて曲線が得られます。

しかし、コードで何かを行うことができます。最後のマウスダウン イベントと現在のマウスダウン イベントの間の距離がしきい値よりも大きい場合 (経験的に取得できます)、曲線に新しいドットを追加できます。以下は、1 つのドットを追加するサンプル コードです。

 public bool isMouseDown { get; set; }
        Point lastPoint = Point.Empty;
        public double treshold { get; set; }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMouseDown)
            {
                pictureBox1.Capture = true; // I try to capture mouse here
                Graphics g = Graphics.FromHwnd(this.pictureBox1.Handle);
                if (Math.Sqrt(Math.Pow(e.X - lastPoint.X, 2) + Math.Pow(e.Y - lastPoint.Y, 2)) > treshold)
                {
                    g.FillRectangle(new SolidBrush(Color.Black), (e.X + lastPoint.X)/2, (e.Y + lastPoint.Y)/2, 1, 1);

                }

                g.FillRectangle(new SolidBrush(Color.Black), e.X, e.Y, 1, 1);
                lastPoint = new Point(e.X, e.Y);
            }
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            isMouseDown = true;
            lastPoint = new Point(e.X, e.Y);
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            isMouseDown = false;
        }
于 2012-10-21T10:55:27.383 に答える