2

最初のコード

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {

            System.Drawing.Graphics g;
            System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(Color.Blue);
            g = pictureBox1.CreateGraphics();
            g.FillRectangle(brush, e.X, e.Y, 5, 5);

    }

このイベントハンドラーは、マウスが画像ボックス上を移動してピクセルを作成するたびに起動します。ここで問題となるのは、マウスをゆっくり動かす限り、これらすべてのピクセルが線を形成することです。ただし、マウスを少し速く動かすと線が途切れ、表示されるのはドットの間に広いスペースがあるドットだけです。

この問題で助けが必要です。

4

4 に答える 4

4

MouseMoveマウスを動かすと、マウスポインタが移動したすべてのピクセルに対してイベントが発生することはありません。かなり一定の時間間隔でそれらを取得するため、マウスの動きが速いほど、取得するポイントが遠くなります。

DrawLine最後に受け取ったポイントの位置を保存し、古い位置と新しい位置の間に実際の線を引く必要があります。

于 2012-12-17T16:12:36.197 に答える
2

行われたコメントから判断すると、あなたがしなければならないことは、あなたのマウスが計算された最後の点とあなたのマウスが現在ある点との間の線を補間することです。あなたのコメントがあなたが望むように示唆するように、これは自由に流れる線を作成します。

代わりに補間するとdraw line、線を曲線にすることができます。明らかに、これらの点の間に線を引くには、処理時間が少なくて済み、十分な場合があります。

于 2012-12-17T16:14:47.133 に答える
1

オーバーライドされたPaintメソッドの外で実際の描画を実行することは決してお勧めしません。むしろ、を呼び出しますInvalidate()

私はあなたのコードをこのように編集します:

void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    //Store necessary painting data from e
    pictureBox1.Invalidate();
}

private void OnPaint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    //Handle painting logic
    base.OnPaint(e);
}
于 2012-12-17T16:12:15.993 に答える
0

問題は、効果的に点だけを線で描いていることであり、アプリケーションは入力に追いつくことができません(マウスが通過/通過するすべてのピクセルに対してMouseEventが呼び出されるわけではありません)。

前のフレームのマウスの位置を追跡する必要があります。そうすれば、そのポイントと現在のフレームの間に滑らかな線を引くことができます。mouseEnter / mouseDown(好きなもの)で「古い」位置を設定し、マウスの移動で描画を行うことができます。描画を行う前に変数を設定していることを確認することが重要ですoldMousePos。そうしないと、いたるところに線が表示されます(変数をチェックして最新であることを確認する価値があるかもしれません)。

描画コード:

private System.Drawing.Point oldMousePos; // old mouse position

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
        System.Drawing.Point curMousePos = e.Location;
        System.Drawing.Graphics g;
        System.Drawing.Pen brush = new System.Drawing.Pen(Color.Blue, 5); // width of 5
        g = pictureBox1.CreateGraphics();
        g.DrawLine(brush, oldMousePos.X, oldMousePos.Y, curMousePos.X, curMousePos.Y); // use a pen for lines rather than a brush (between 2 points)
        g.Dispose(); // mark the graphics object for collection
        oldMousePos = curMousePos; // set old to be this (so you get a continuous line)
}

レンダリングを行う別の方法を検討するかもしれません-マウスイベント内にGraphicsオブジェクトを作成するのは少し危険です。

于 2012-12-17T16:21:37.570 に答える