2011-02-02 9 views
1

mousemoveイベントで図形の周りに図形をドラッグしようとしていますが、スムーズに動かせようと苦労しています。画像ボックスには背景としてロードされた画像があり、マウスをクリックしてドラッグしたときに画像の上に円をドラッグするようにグラフィックオブジェクトを希望します。ビットマップの上にグラフィックスオブジェクトをドラッグする

マウスを移動して画像ボックスを再読み込みするたびに元の画像のクローンを作成していますが、これを実現するにはより良い方法でなければならないようです。

グラフィックスが追加されるたびに元のビットマップを再ロードせずに、ペイントアプリケーションのような軌跡を作成します。

イメージ全体を再読み込みせずに以前の図面をクリアするにはどうすればよいですか?どんな助けもありがたい。

private void picCanvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_drag) 
    { 
     picCanvas.Image = (Bitmap)_original.Clone(); 
     Graphics g = Graphics.FromImage((Bitmap)picCanvas.Image); 
     g.DrawEllipse(_whitePen, e.X, e.Y, 10, 10); 
     picCanvas.Invalidate(); 
    } 
} 

private void picCanvas_MouseDown(object sender, MouseEventArgs e) 
{ 
    _drag = true; 
} 

private void picCanvas_MouseUp(object sender, MouseEventArgs e) 
{ 
    _drag = false; 
} 

答えて

0

この問題を解決するには、picCanvas.Paintイベントを使用してください。 mousemoveイベントの位置を設定し、その位置を使用してpaintイベントを描画します。

Point pos = Point.Empty;// or your initial position 

    private void picCanvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (_drag) 
     { 
      pos = e.Location; 
     } 
    } 
    private void picCanvas_Paint(object sender, PaintEventArgs e) 
    { 
     if (_drag) 
     { 
      Graphics g = e.Graphics;//The event handler sends us the graphics object to use for painting 
      g.DrawEllipse(_whitePen, pos.X, pos.Y, 10, 10); 
     } 
    } 

コントロールにPaintイベントを追加し、イメージをformloadまたは初期化関数で設定する必要があります。

picCanvas.Image = (Bitmap)_original.Clone(); 
+0

のおかげで、このサンプルでは、​​その後リフレッシュ

picCanvas.Image = image; picCanvas.Invalidate() 

が発生します。私はわずかな変更を加える必要がありました。なぜなら、ペイントイベントはtrueの "_drag"値を受け取ったようには見えなかったので、決して描くことはできませんでした。 – fluent

+0

グラフィックスオブジェクトの行を追加するのを忘れました。編集したコードをご覧ください。 – honibis

+0

これはさらに優れています。どうもありがとう。私はまだ描画後にpicCanvas.Invalidateを呼び出す必要があります。そうしないと、描画が画面に表示されるようです。 – fluent

0

上記のホニビスの回答を使用して、私はこれで終わりました。

画像内の負荷や絵を無効には、ペイントイベント

private void picCanvas_Paint(object sender, PaintEventArgs e) 
{ 
    if (_drag)   
    { 
    using (Pen pen = new Pen(Color.White, 2)) 
    { 
     e.Graphics.DrawEllipse(pen, pos.X, pos.Y, 10, 10); 
    } 
    } 
} 
3

チェックそれは単純

//Load Image 
Bitmap TestImage = new Bitmap(FileName); 
//Create Graphics Object 
Graphics g = Graphics.FromImage(TestImage);     
g.DrawEllipse(new Pen(Color.Red), i, j,0.5F, 0.5F); 
//View Your Results 
pictureBox1.Image = TestImage; 
関連する問題