2017-01-26 4 views
0

これまで行ってきたことです。私はコードを探していて、プログラムに戻してみました。しかし、それは全く機能しません。Unable Cで描画した行を削除するには、ピクチャボックスのバックスペースキーを使用してください。

public Form1() 
    { 
     InitializeComponent(); 
     this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); 
    } 
    int originalX, originalY; 
    int startX, startY, endX, endY; 
    int pointX1, pointY1; 
    int pointX2, pointY2; 
    Graphics g; 
    int i = 0, j = 0; 
    Bitmap image; 


    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      if (i == 0) 
      { 
       image = (Bitmap)pictureBox1.Image; 
       pictureBox1.Invalidate(); 
       originalX = startX = e.X; 
       originalY = startY = e.Y; 
       g = Graphics.FromImage(image); 
      } 

     } 

    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      pictureBox1.Refresh(); 
      g = pictureBox1.CreateGraphics(); 
      if (j < 10000000) 
      { 
       if (i != 0 ) 
       { 
        startX = pointX1; 
        startY = pointY1; 
       } 

       pointX2 = e.X; 
       pointY2 = e.Y; 
       g.DrawLine(Pens.Black, new Point(startX, startY), new Point(pointX2, pointY2)); 
       j++; 
      } 

     } 

    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      g = Graphics.FromImage(image); 
      if (i <100000000) 
      { 
       if (i != 0) 
       { 
        startX = pointX1; 
        startY = pointY1; 
       } 
       pointX1 = e.X; 
       pointY1 = e.Y; 
       g.DrawLine(Pens.Black, new Point(startX, startY), new Point(pointX1, pointY1)); 
      } 

      } 
      i++; 
     } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     pictureBox1.Image = Image.FromFile(@"C:\Users\student03\Documents\image\Sky2.jpg"); 
    } 

    private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      g = Graphics.FromImage(image); 
      g.DrawLine(Pens.Black, new Point(pointX1, pointY1), new Point(originalX, originalY)); 
      pictureBox1.Image = image; 
      i = 0; 
     } 
    } 
    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Back) 
     { 
       pictureBox1.Invalidate(); 
     } 

答えて

1

フォームでInitializeComponent();コールの下this.KeyPreview = true;を追加します。

public Form1() 
{ 
    InitializeComponent(); 
    this.KeyPreview = true; 
    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); 
} 

Form.KeyPreviewは、あなたのFormオブジェクトが集中しControl要素に入る前に押されたキーをプレビューすることが可能であることを示すブール値フィールド/プロパティです。

EDIT:

あなたがあなたのコード内のすべてのものを変更する必要が描画している行を削除することができるようにするには。しかし、最初から始まった。あなたは、構造物のいくつかの種類がアイテムを描画に関する情報を格納するLineと呼ば行う必要があります

public struct Line 
{ 
    public Point StartingPoint; 
    public Point EndingPoint; 
} 

次に、あなたのForm1のコードでは、これらのフィールドを削除する必要があります。

int originalX, originalY; 
int startX, startY, endX, endY; 
int pointX1, pointY1; 
int pointX2, pointY2; 
Graphics g; 

をそしてこれらに置き換える:

List<Line> lines; 
Line current; 

コンストラクタでlinesをインスタンス化する必要があります。

public Form1() 
{ 
    InitializeComponent(); 
    this.KeyPreview = true; 
    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown); 
    lines = new List<Line>(); 
} 

作成する線を参照するため、現在作成している線を保持するオブジェクトが1つあります。

次は、画像に直接描画していることです。私はそれがForm1に新しいフィールドを追加するために必要となる、あなたのケースでリファレンスとして、元画像を保存をお勧めしますし、画像のコピーを変更します:

Image originalImage; 

そして、あなたのbutton2_Click内側:

originalImage = Image.FromFile(@"C:\Users\student03\Documents\image\Sky2.jpg"); 
pictureBox1.Image = originalImage.Clone(); 

議事録に描画セクション。今、あなたはスタート位置で満たされ、現在の行を持っていて、pictureBox1_MouseUpを変更するに進むことができ

if (e.Button == System.Windows.Forms.MouseButtons.Left) 
{ 
    if (i == 0) 
    { 
     current = new Line(); 
     current.StartingPoint = new Point(e.X, e.Y); 
    } 
} 

::のようなものにpictureBox1_MouseDownの内容を変更

if (e.Button == System.Windows.Forms.MouseButtons.Left) 
{ 
    current.EndingPoint = new Point(e.X, e.Y); 
    lines.Add(current) 
    pictureBox1.Image = originalImage.Clone(); 
    Graphics g = Graphics.FromImage(pictureBox1.Image); 
    if (i <100000000) 
    { 
     foreach(Line l in lines) 
     { 
      g.DrawLine(Pens.Black, l.StartingPoint, l.EndingPoint); 
     }  
    } 
} 
i++; 

ほぼ同じロジックではなくpictureBox1_MouseMoveに適用されますが、 current行をlinesリストに追加する場合は、最後に描画する必要があります。

if (e.Button == System.Windows.Forms.MouseButtons.Left) 
{ 
    pictureBox1.Image = originalImage.Clone(); 
    Graphics g = Graphics.FromImage(pictureBox1.Image); 
    if (i <100000000) 
    { 
     foreach(Line l in lines) 
     { 
      g.DrawLine(Pens.Black, l.StartingPoint, l.EndingPoint); 
     }  
    } 
    current.EndingPoint = new Point(e.X, e.Y); 
    g.DrawLine(Pens.Black, current.StartingPoint, current.EndingPoint); 
} 
i++; 
それはあなたがイメージ自体に描画していないので、それは非常にunefficientの仕事だろうにもかかわらず

if (e.KeyCode == Keys.Back) 
{ 
    if (lines.RemoveAt(lines.Count - 1)) 
    { 
     pictureBox1.Image = originalImage.Clone(); 
     Graphics g = Graphics.FromImage(pictureBox1.Image); 
     foreach(Line l in lines) 
     { 
      g.DrawLine(Pens.Black, l.StartingPoint, l.EndingPoint); 
     } 
    } 
} 

:その後、あなたは自分のラインコレクション内の最後の項目を削除し、画像を再描画する必要がある行を削除する

pictureBox1コントロール。代わりに画像の上に絵を描くためにpictureBox1.Paintイベントを使用することをお勧めします。

+0

ありがとうございました!それは完全に動作します!しかし、バックスペースを使い、私が描いた線を削除する方法があるようです。あなたもそれで私を助けてくれますか? –

+0

@VernonPichu現在のところ、画面の外に描画情報を保存していないので、ほとんど不可能です。しかし、私は後でラインを削除するためにあなたがすべきことでこの答えを更新します。 –

+0

ありがとうございます。確かに、私は図面上にデータを保存していないと理解しています。私を更新してください、本当に大きな助けに感謝します。 –

関連する問題