Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > рисование при движении мыши


Автор: VanHelsing 24.2.2013, 00:54
Здравствуйте. Необходтмо выполгить небольшое приложение, которое позволяет рисовать разлтчные геоиетрические объекты. Дело в том чтобы нарисовать одно изображение у меня вопросов нет, но если уже есть одга фигура и необходтмо нарисовать дургую (использование Refresh). Необходтмо чтобы нолвые фигуры оставыались на форме(PictureBox). Но все стирается и рисуется только одна новая фигура. 
Код

    public partial class Form1 : Form
    {
        Boolean b;
        int x1 = 0, y1 = 0;
        int x2 = 0, y2 = 0;
        Graphics g;
        public Form1()
        {
            InitializeComponent();
            g = pictureBox1.CreateGraphics();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            /*System.Drawing.Graphics graphics = this.CreateGraphics();
            System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle(50, 50, 150, 150);
            graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle);
            graphics.DrawRectangle(System.Drawing.Pens.Red, rectangle);
            graphics.DrawLine(Pens.Black, new Point(100, 50), new Point(100, 150));*/
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            b = false;
            g.DrawRectangle(Pens.Black, x1, y1, e.X - x1, e.Y - y1);      
        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (b)
            {
                pictureBox1.Refresh();
                g.DrawRectangle(Pens.Black, x1, y1, e.X - x1, e.Y - y1);
            }
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            b = true;
            x1 = e.X;
            y1 = e.Y;
        }
    }
 
Подскажите как мне правильно рганизоавать этот процесс. (Про рисование на Bitmao знаю, но при загрузке изображение оно все равно будет меняться).

Автор: phomm 24.2.2013, 09:25
Завести массив координат фигур и перерисовывать все уже запомненные фигуры после рефреша. По мышке меняются только координаты последней записи массива. Но это тормозно - постоянно надо перерисовывать всё.

А вообще, конечно, лучше битмапы, создаём 2 штуки - один буфер для готового, а второй для текущего. Сперва в текущий буфер рисуем готовый, потом поверх готового рисуем текущий эллипс, когда мышка ещё даже не отпущена. Текущий рисуем на пикчабокс, тогда постоянно будет полная картина. Когда же мышка отпущена, полученный эллипс дорисовываем на готовый.
Тогда перерисовывать только буфер и на него новый эллипс. 

Автор: VanHelsing 24.2.2013, 09:44
Цитата

А вообще, конечно, лучше битмапы, создаём 2 штуки - один буфер для готового, а второй для текущего. Сперва в текущий буфер рисуем готовый, потом поверх готового рисуем текущий эллипс, когда мышка ещё даже не отпущена. Текущий рисуем на пикчабокс, тогда постоянно будет полная картина. Когда же мышка отпущена, полученный эллипс дорисовываем на готовый.
Тогда перерисовывать только буфер и на него новый эллипс. 

Но если мы будем рисовать в текущий он будет очищаться и не будет видно что было нарисовано ранее. Можно небольшой пример, я не совсем понял.

Автор: phomm 24.2.2013, 12:14
Цитата(phomm @  24.2.2013,  09:25 Найти цитируемый пост)
Сперва в текущий буфер рисуем готовый

За счёт этого и не будет "очищаться", в кавычках, потому что будет поверх врисовыватся запомненное..

Прикладываю тестполигон. При таком исполнении автоматически есть двойная буфферизация (свойство формы для которой почему-то плохо работало для случая с пикчербокс.рефреш) 


Автор: VanHelsing 24.2.2013, 19:30
Спасибо большое. Только пытаюсь разобраться почему при рисовании нижняя часть прямоугольника не отображается, а отображается только при рисовании следующего прямоугольника.

Автор: VanHelsing 27.2.2013, 09:13
Спасибо большое, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)