Рисование на PictureBox внутри панели - С#

Вопрос, который у меня есть здесь, является своего рода 2 частью.

У меня есть изображение, которое расположено внутри панели. Когда я открываю изображение, размер изображения изменяется в соответствии с размером изображения, а размер панели остается прежним. На панели есть только полосы прокрутки, чтобы увидеть все изображение.

Есть 2 вещи, которые идут не так с этим.

  1. Когда я изменяю размер изображения, по какой-то причине я могу рисовать только в предыдущей части изображения. Бывший. Imagebox по умолчанию начинается с размера 200x200. Я открываю изображение размером 500x400. И я все еще могу рисовать только часть изображения размером 200x200.

  2. Вторая проблема, с которой я сталкиваюсь, заключается в том, что когда я рисую в этой выборочной части изображения, когда я прокручиваю до того места, где моя картина не видна, и возвращаюсь, изображение, которое я нарисовал, исчезло. Я знаю, что мне нужно что-то вроде picturebox.invalidate(). Я просто не уверен, как его использовать.

Вот мой код, чтобы понять, что я делаю.

public Form1()
    {
        InitializeComponent();

        DrawArea = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height );
        pictureBox1.Image = DrawArea;

        objGraphics = this.pictureBox1.CreateGraphics();
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
            drawImage(e);
    }

    public void drawImage(MouseEventArgs e)
    {
        Rectangle rDraw = new Rectangle();

        if (e.Button == MouseButtons.Left)
        {
            rDraw.X = e.X;
            rDraw.Y = e.Y;
            rDraw.Width = 3;
            rDraw.Height = 3;
            objGraphics.DrawEllipse(System.Drawing.Pens.Black, rDraw);
        }
    }

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Image Files(*.jpg; *.bmp)|*.jpg; *.bmp";
            if (open.ShowDialog() == DialogResult.OK)
            {
                Bitmap bit = new Bitmap(open.FileName);

                pictureBox1.Size = bit.Size;
                DrawArea = bit;
                pictureBox1.Image = bit;
            }
        }
        catch (Exception)
        {
            throw new ApplicationException("Failed loading image");
        }
    }

Большое спасибо!


person Johnrad    schedule 29.11.2011    source источник


Ответы (1)


Вам нужно рисовать в событии Paint окна изображения.

Вы (почти) никогда не должны рисовать на CreateGraphics().

person SLaks    schedule 29.11.2011
comment
Как именно я бы это сделал. У меня есть событие рисования, но я не уверен, как именно рисовать, используя это событие. - person Johnrad; 29.11.2011
comment
Нарисуйте e.Graphics. Событие рисования может запускаться много раз (например, при прокрутке). Чтобы заставить его перекраситься, Invalidate() его. - person SLaks; 29.11.2011
comment
Извините за наивность. Я бы правильно перегрузил событие рисования? передать его из моего события mouse_move? - person Johnrad; 29.11.2011
comment
Нет. Обработайте событие PictureBox Paint (если только вы не хотите рисовать непосредственно на форме) и используйте его e. - person SLaks; 29.11.2011
comment
Я позволяю пользователю рисовать на изображении, как если бы оно было карандашом. Я не понимаю, как я могу сделать это вместе с событием mouse_over. - person Johnrad; 29.11.2011
comment
Сохраните линии, нарисованные пользователем, в событиях мыши и нарисуйте все эти линии в событии рисования. - person SLaks; 29.11.2011