Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Перерисовка Panel


Автор: Relrin 13.9.2012, 18:31
Необходимо чтобы после того, как загнал все точки в список (List), их отрисовало на panel. Причем так, чтобы "не моргала" панель. Быть может подскажет кто, как решить эту проблемку?
Код:

Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace Lab_1_MiAPR
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // массив точек
        private List<Points> pointArray = new List<Points>();
 
        private void button1_Click(object sender, EventArgs e)
        {
            // читаем значения с полей
            int cntPoints = Convert.ToInt32(cntBox.Text); // сколько объектов
            int cntClass  = Convert.ToInt32(cntCls.Text); // сколько классов объектов
            // создаем экземляры объектов и задаем им случайные значения
            for(int i = 0; i < cntPoints; i++)
            {
                pointArray.Add(new Points(panel.Width-10,panel.Height-10));
            }
            
        }
 
        private void panel_Paint(object sender, PaintEventArgs e)
        {
            foreach (Points pt in pointArray)
            {
                e.Graphics.DrawRectangle(new Pen(Color.Black, 1),new Rectangle(pt.x,pt.y,1,1));
            }
            panel.Refresh();
        }
    }
}

Автор: diadiavova 13.9.2012, 19:54
http://msdn.microsoft.com/ru-ru/library/3t7htc9c.aspx

Автор: Relrin 13.9.2012, 20:06
Цитата(diadiavova @ 13.9.2012,  19:54)
http://msdn.microsoft.com/ru-ru/library/3t7htc9c.aspx

Спасибо, помогло.
Пока только одно не ясно - почему, рисует только одну точку из List'а, хотя я указываю больше чем одну. Причем, каждая задается случайными числами:

Код

       public Points(int maxX, int maxY)
        {
            Random random = new Random();
            x = random.Next(maxX);
            y = random.Next(maxY); 
        }

Автор: diadiavova 13.9.2012, 20:37
Попробуй так
Код

       Random random = new Random();
       public Points(int maxX, int maxY)
        {

            x = random.Next(maxX);
            y = random.Next(maxY); 
        }

Автор: Relrin 13.9.2012, 20:42
Цитата(diadiavova @ 13.9.2012,  20:37)
Попробуй так
Код

       Random random = new Random();
       public Points(int maxX, int maxY)
        {

            x = random.Next(maxX);
            y = random.Next(maxY); 
        }

Все так же. Рисует одну точку. Рисует по одной дальше, если я кнопку нажимаю поразово.

Автор: diadiavova 13.9.2012, 20:47
Цитата(Relrin @  13.9.2012,  21:42 Найти цитируемый пост)
Все так же. Рисует одну точку. Рисует по одной дальше, если я кнопку нажимаю поразово.

А как надо? У тебя ведь тут только одна точка прописана. Заполни список в цикле и будет много разных точек.

Автор: Relrin 13.9.2012, 20:49
Цитата(diadiavova @ 13.9.2012,  20:47)
Цитата(Relrin @  13.9.2012,  21:42 Найти цитируемый пост)
Все так же. Рисует одну точку. Рисует по одной дальше, если я кнопку нажимаю поразово.

А как надо? У тебя ведь тут только одна точка прописана. Заполни список в цикле и будет много разных точек.

Так все точки, которые я создаю (их количество я заранее задаю) помещаю в список (List<Points>), к которому потом выполняю код:
Код

foreach (Points pt in pointArray)
{
    e.Graphics.DrawRectangle(new Pen(Color.Black, 1),new Rectangle(pt.x,pt.y,1,1));
}

Но, отрисовывается, все равно одну точку. Не могу понять почему...

Автор: diadiavova 13.9.2012, 20:49
Код

for(var i = 0; i <10; i++)
{
    pointArray.Add(new Point(random.Next(maxX),random.Next(maxY));
}


Автор: Relrin 13.9.2012, 20:53
Цитата(diadiavova @ 13.9.2012,  20:49)
Код

for(var i = 0; i <10; i++)
{
    pointArray.Add(new Point(random.Next(maxX),random.Next(maxY));
}

Я в обработчике кнопки писал даже так уже:
Код

            Bitmap bmp = new Bitmap(pictureBox.Width, pictureBox.Height);
            Graphics gr = Graphics.FromImage(bmp);
            for (int i = 0; i < pointArray.Count; i++)
            {
                gr.DrawRectangle(new Pen(Color.Red, 5), pointArray.ElementAt(i).x, pointArray.ElementAt(i).y, 4, 4);  
            }
            gr.Dispose();
            pictureBox.Image = bmp;

Просто сугубо для проверки и отчаяния. Все равно рисует одну точку. Пока не нажму кнопку - не отрисует вторую. Третий раз - третью и т.д.

Автор: diadiavova 13.9.2012, 20:53
А ты в этом цикле
Код

           for(int i = 0; i < cntPoints; i++)
            {
                pointArray.Add(new Points(panel.Width-10,panel.Height-10));
            }
Несколько раз загоняешь одну и ту же точку в список

Автор: Relrin 13.9.2012, 20:56
Цитата(diadiavova @ 13.9.2012,  20:53)
А ты в этом цикле
Код

           for(int i = 0; i < cntPoints; i++)
            {
                pointArray.Add(new Points(panel.Width-10,panel.Height-10));
            }
Несколько раз загоняешь одну и ту же точку в список

Должны же быть другие способы пройтись по списку и отрисовать, чем по N раз загонять одну и ту же точку. Мы же из списка не удаляем точки, а только добавляем, а затем считываем...  smile 

Автор: diadiavova 13.9.2012, 20:57
Цитата(Relrin @  13.9.2012,  21:56 Найти цитируемый пост)
Должны же быть другие способы пройтись по списку и отрисовать, чем по N раз загонять одну и ту же точку.

Как раз загонять одну и ту же не надо, а ты это делаешь. Тот код я у тебя скопировал

Автор: Relrin 13.9.2012, 21:02
Цитата(diadiavova @ 13.9.2012,  20:57)
Цитата(Relrin @  13.9.2012,  21:56 Найти цитируемый пост)
Должны же быть другие способы пройтись по списку и отрисовать, чем по N раз загонять одну и ту же точку.

Как раз загонять одну и ту же не надо, а ты это делаешь. Тот код я у тебя скопировал

Одна и таже точка не загоняется. В кострукторе класса идет инициализация точки, ее положения, а затем запись в список, List.

Автор: diadiavova 13.9.2012, 21:04
Цитата(Relrin @  13.9.2012,  22:02 Найти цитируемый пост)
Одна и таже точка не загоняется. В кострукторе класса идет инициализация точки, ее положения, а затем запись в список, List. 

Ну я что вижу в коде, о том и говорю.
Ладно, я тебе попозже(возможно еще сегодня) выложу пример, а то так мы друг друга не поймем.

Автор: Relrin 13.9.2012, 21:08
Цитата(diadiavova @ 13.9.2012,  21:04)
Цитата(Relrin @  13.9.2012,  22:02 Найти цитируемый пост)
Одна и таже точка не загоняется. В кострукторе класса идет инициализация точки, ее положения, а затем запись в список, List. 

Ну я что вижу в коде, о том и говорю.
Ладно, я тебе попозже(возможно еще сегодня) выложу пример, а то так мы друг друга не поймем.

Я даже в отладчике прошелся по коду. Инициализация там верная. При foreach "извлекает" элементы, подает команды на отрисовку с этими точками. Но не отображает, почему-то. Хотя в том же битмапе, я сначала отрисовываю, как своего рода буффере. А затем даю команду на отрисовку в pictureBox. В итоге, почему-то рисует ОДНУ точку, а не N...

Другими словами:
- В списке есть все элементы, которые я проинициализировал ранее
- В этом фрагменте, в foreach, элементы из списка считываются в obj корректно и хранят позицию его на форме
- После первой "итерации", берет новый элемент, но его "не добавляет"/не отрисовывает на битмапе(скорей всего так), и не выводит на picturebox...
Вопрос. Почему так? Почему после первой итерации не рисует на объекте, хотя из списка элемент считан?

Автор: diadiavova 13.9.2012, 21:58
вот пример, там в меню нажимаешь пункт и все точки перерисовываются

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