Проблема с созданием новой картинной коробки! - PullRequest
0 голосов
/ 16 апреля 2011

Сначала я извиняюсь за мой плохой английский. Теперь у меня проблема с моим проектом C # (ms paint). Когда я открываю новое изображение в графическом окне, последняя нарисованная мною фигура остается, пока я не нарисую другую линию на этом изображении. Вот мой код:
Линия рисования:

 public Form1()
    {
        InitializeComponent();
        snapshot = new Bitmap(pictureBox1.Width, pictureBox1.Height);
     }
 if (tempDraw != null)
                {
                    tempDraw = (Bitmap)snapshot.Clone();
                    Graphics g = Graphics.FromImage(tempDraw);
                    Pen myPen = new Pen(colorPickerDropDown1.SelectedColor, 5);
                    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                    myPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                    g.DrawLine(myPen, pDau, pHientai);
                    myPen.Dispose();
                    e.Graphics.DrawImageUnscaled(tempDraw, 0, 0);
                    g.Dispose();
                }

- события мыши:

 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        paint = false;
        snapshot = (Bitmap)tempDraw.Clone();

    }

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        paint = true;
        saved = false;
        pDau = e.Location;
        tempDraw = (Bitmap)snapshot.Clone();
    }
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (paint)
        {
            pHientai = e.Location;
            pictureBox1.Invalidate();
            saved = false;
        }
    }

- создать новую графическую рамку:

   public void New()
    {

        pictureBox1.Image =null;
        snapshot = null;
        tempDraw = null;
        snapshot= new Bitmap(pictureBox1.Width, pictureBox1.Height);
    }

-Откройте изображение:

  New();
                snapshot = new Bitmap(openFileDialog1.FileName);
                tempDraw = (Bitmap)snapshot.Clone();
                pictureBox1.Image = new Bitmap(openFileDialog1.FileName);
                strPath = openFileDialog1.FileName;
                this.Text = strPath + " - Paint";

Можете ли вы сказать мне что-то не так? Огромное спасибо!

1 Ответ

0 голосов
/ 16 апреля 2011

В вашем самом первом примере кода я прав, предполагая, что весь оператор if фактически находится в событии Paint формы?Например:

private void Form_Paint(object sender, PaintEventArgs e)
{
    if (tempDraw != null)
    {
        tempDraw = (Bitmap)snapshot.Clone();
        Graphics g = Graphics.FromImage(tempDraw);
        Pen myPen = new Pen(colorPickerDropDown1.SelectedColor, 5);
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        myPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
        g.DrawLine(myPen, pDau, pHientai);
        myPen.Dispose();
        e.Graphics.DrawImageUnscaled(tempDraw, 0, 0);
        g.Dispose();
    }
}

Если это так, рассмотрите возможность вызова e.Graphics.Clear(this.BackColor), чтобы очистить форму с собственным цветом фона.Это эффективно удалит все, что вы нарисовали.Кроме того, учитывайте оператор using при создании объектов чертежа, чтобы защитить вас, если какой-либо метод выдает исключение.Я бы переписал ваше if утверждение так:

    if (tempDraw != null)
    {
        tempDraw = (Bitmap)snapshot.Clone();

        using (Graphics g = Graphics.FromImage(tempDraw))
        using (Pen myPen = new Pen(colorPickerDropDown1.SelectedColor, 5))
        {
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            myPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            g.DrawLine(myPen, pDau, pHientai);
            e.Graphics.Clear(this.BackColor); // clear any drawing on the form
            e.Graphics.DrawImageUnscaled(tempDraw, 0, 0);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...