Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Arigato
Программист
281 / 178 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
1

Как избежать мерцания при перерисовке Panel

13.09.2012, 19:12. Просмотров 2601. Ответов 11
Метки нет (Все метки)

Необходимо чтобы после того, как загнал все точки в список (List), их отрисовало на panel. Причем так, чтобы "не моргала" панель. Быть может подскажет кто, как решить эту проблемку?
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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();
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2012, 19:12
Ответы с готовыми решениями:

Как избежать мерцания при перетаскивании формы
Пользуясь случаем Вы не подскажите как избедать мерцания при перетаскивании...

Графика в Windows forms - как избежать мерцания при анимации
Необходимо создать несложную движения анимацию в Windows Forms. Как сделать это...

Как убрать мерцания картинки элемента Panel?
Да, все та же двойная буферизация. Итак, начну сначала. Вся моя программа...

Избавится от мерцания panel
Здравствуйте. Вот код: public void CreateEllements() { ...

Как убрать мерцание формы при перерисовке?
у меня в бекграундвокере каждую миллисекунду перерисовывается интерфейс прям на...

11
canopen
420 / 421 / 93
Регистрация: 16.07.2012
Сообщений: 886
13.09.2012, 20:14 2
Попробуйте добавить в конструктор формы
C#
1
this.DoubleBuffered = true
0
Arigato
Программист
281 / 178 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
13.09.2012, 20:19 3
Проверил. Не помогло
0
GRooN
51 / 51 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:29 4
C#
1
2
3
4
5
public Form1()
{
    InitializeComponent();
    panel.GetType().GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(panel, new object[] { ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer | ControlStyles.UserPaint, true});
}
0
Arigato
Программист
281 / 178 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
13.09.2012, 20:34 5
Не помогло. Все равно рисует по точке, нажимая при этом на кнопку.
0
GRooN
51 / 51 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:42 6
Точка все равно мерцает? И в чем смысл все точки рисовать в одном месте(не зависимо от вводимых значений)? Может посвятите в суть задачи?
0
Arigato
Программист
281 / 178 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
13.09.2012, 20:45 7
Мне нужно, после того, как все точки созданы и расположены в List<Points> их нарисовать на Panel. Однако в обработчике Paint, идет отрисовка только точки(одной). Других как будто-бы и нет...

В конструкторе Point, следующий код:
C#
1
2
3
4
5
6
        public Points(int maxX, int maxY)
        {
            Random random = new Random();
            x = random.Next(maxX);
            y = random.Next(maxY);
        }
0
GRooN
51 / 51 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:48 8
Всё правильно, у вас всем точкам задается одинаковые координаты
C#
1
pointArray.Add(new Points(panel.Width-10,panel.Height-10));
тут все значения фиксированные
0
Arigato
Программист
281 / 178 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
13.09.2012, 20:50 9
Но почему? В конструктор же они подаются как максимальные значения для генератора случайных чисел? В констукторе, инициализация координат точки идет.
0
GRooN
51 / 51 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:56 10
пришлите код класса Points
0
Arigato
Программист
281 / 178 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
13.09.2012, 22:31 11
Вот он:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Lab_1_MiAPR
{
    class Points
    {
        public int x, y;      // координаты объекта
 
        // задание параметров для объекта с помощью конструктора
        public Points(int maxX, int maxY)
        {
            Random random = new Random();
            x = random.Next(maxX);
            y = random.Next(maxY); 
        }
    }
}
Добавлено через 1 час 32 минуты
Ради интереса написал этот кусочек и вставил в обработчик кнопки. Мне хотелось проверить, будет ли рисовать N точек, которые я поместил в список. Что получилось:
- В списке есть все элементы, которые я проинициализировал ранее
- В этом фрагменте, в foreach, элементы из списка считываются в obj корректно и хранят позицию его на форме
- После первой "итерации", берет новый элемент, но его "не добавляет"/не отрисовывает на битмапе(скорей всего так), и не выводит на picturebox...
Вопрос. Почему так? Почему после первой итерации не рисует на объекте, хотя из списка элемент считан?
C#
1
2
3
4
5
6
7
8
            Bitmap bmp = new Bitmap(pictureBox.Width, pictureBox.Height);
            Graphics gr = Graphics.FromImage(bmp);
            foreach(Points obj in pointArray)
            {
               gr.DrawRectangle(new Pen(Color.Red,5),obj.x,obj.y,4,4);
            }
            pictureBox.Image = bmp;
            gr.Dispose();
0
GRooN
51 / 51 / 15
Регистрация: 22.02.2011
Сообщений: 87
14.09.2012, 12:47 12
C#
1
2
3
4
5
6
7
8
9
10
11
12
    class Points
    {
       private static Random random = new Random();
        public int x, y;      // координаты объекта
 
        // задание параметров для объекта с помощью конструктора
        public Points(int maxX, int maxY)
        {
            x = random.Next(maxX);
            y = random.Next(maxY); 
        }
    }
Создание новой точки создает новый экземпляр Random, поэтому все значения будут одинаковы, а статическое поле будет одно для всех
0
14.09.2012, 12:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2012, 12:47

Как устранить мерцание при перерисовке PictureBox?
Привет. Рисую на Bitmap, а потом PictureBox'у его присваиваю. Вопрос как убрать...

Как избавиться от мерцания при прорисовке
суть программы: на форме создал панель Panel и на ней рисую фигуру статическую,...

Как избавиться от мерцания при перемещении Picturebox?
привет, необходимо организовать движение спрайта по форме, при перемещении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru