Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/30: Рейтинг темы: голосов - 30, средняя оценка - 4.80
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5

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

13.09.2012, 19:12. Показов 6228. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2012, 19:12
Ответы с готовыми решениями:

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

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

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

11
432 / 433 / 93
Регистрация: 16.07.2012
Сообщений: 886
13.09.2012, 20:14
Попробуйте добавить в конструктор формы
C#
1
this.DoubleBuffered = true
0
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
13.09.2012, 20:19
Проверил. Не помогло
0
 Аватар для GRooN
52 / 52 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:29
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
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
13.09.2012, 20:34
Не помогло. Все равно рисует по точке, нажимая при этом на кнопку.
0
 Аватар для GRooN
52 / 52 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:42
Точка все равно мерцает? И в чем смысл все точки рисовать в одном месте(не зависимо от вводимых значений)? Может посвятите в суть задачи?
0
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
13.09.2012, 20:45
Мне нужно, после того, как все точки созданы и расположены в 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
52 / 52 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:48
Всё правильно, у вас всем точкам задается одинаковые координаты
C#
1
pointArray.Add(new Points(panel.Width-10,panel.Height-10));
тут все значения фиксированные
0
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
13.09.2012, 20:50
Но почему? В конструктор же они подаются как максимальные значения для генератора случайных чисел? В констукторе, инициализация координат точки идет.
0
 Аватар для GRooN
52 / 52 / 15
Регистрация: 22.02.2011
Сообщений: 87
13.09.2012, 20:56
пришлите код класса Points
0
Программист
 Аватар для Arigato
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 685
Записей в блоге: 5
13.09.2012, 22:31
Вот он:
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
52 / 52 / 15
Регистрация: 22.02.2011
Сообщений: 87
14.09.2012, 12:47
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.09.2012, 12:47
Помогаю со студенческими работами здесь

WinApi в C# или как избавиться от мерцания формы при перерисовке
В С# как можно до api добраться? У меня при перерисовке форма моргает - просто ужаSS. WM_EraseBckgrnd как нибудь можно выдернуть? или в С#...

Как избежать мерцания картинок (картинки-кнопки)?
У меня есть форма, на которой 2 картинки. Первая картинка с изображением обычной кнопки. Вторая картинка - изображение активной...

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

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

Как сохранить фон при перерисовке?
Помогите разобраться, пожалуйста. Хотела бы, чтобы новый фрагмент перерисовывался в панели gallereja на старом фоне. Вместо этого фон при...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru