Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
1

Рисование на PictureBox. При повторном рисовании предыдущее изображение стирается

28.02.2014, 21:26. Показов 2186. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, никак не могу разобраться в чем дело. Необходимо вывести "звездное небо", раскидав на черном фоне разноцветные точки (заполненные эллипсы если точнее). Проблема в том, что на выходе отрисовывается только одна звезда (список звезд List<Star> заполняется нормально - их 50 штук). Думаю они друг друга затирают. Излазил кучу форумов, сделал вроде все как надо, но толку ноль. В чем ошибка?

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
List<Star> Stars = new List<Star>();
        Graphics Pic;
        Bitmap btmp;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            btmp = new Bitmap(pictureBoxSky.Width, pictureBoxSky.Height);
            Pic = Graphics.FromImage(btmp);
            Pic.Clear(Color.Black);
            pictureBoxSky.Image = btmp;
            for (int i = 0; i < numericUpDownStarsCount.Value; ++i)
            {
                Stars.Add(Star.GetRandom(pictureBoxSky.Width, pictureBoxSky.Height));
            }
            ShowStars();
            pictureBoxSky.Refresh();
        }
 
        private void ShowStars()
        {
            foreach (var t in Stars)
            {
                Pic.FillEllipse(new SolidBrush(t.GetColor()), t.GetX(), t.GetY(), 3, 3);
            }
        }
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
class Star
    {
        private float x, y;
        private Color color;
 
        public float GetX()
        {
            return this.x;
        }
 
        public float GetY()
        {
            return this.y;
        }
 
        public Color GetColor()
        {
            return this.color;
        }
 
        public static Star GetRandom(int widht, int height)
        {
            Star Rez = new Star();
            Random A = new Random();
            Rez.x = (float)A.Next() % widht;
            Rez.y = (float)A.Next() % height;
            Rez.color = Color.FromArgb((int)A.Next(50, 255), (int)A.Next(50, 255), (int)A.Next(50, 255));
            return Rez;
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2014, 21:26
Ответы с готовыми решениями:

Рисование на PictureBox: изображение тут же стирается
Как можно решить такую проблему: есть picturebox, я в него загружаю картинку с помощью метода...

Рисование на Picturebox: нарисованное стирается при сворачивании формы
Здравствуйте, подскажите как нарисовать на Picturebox. Нужно рисовать карандашом как в пейнте. ...

Изображение стирается в pictureBox
Всем привет =) В своем классе рисую геометрические фигуры. Потом вывожу их на экран с помощью...

При повторном нажатии кнопки значение textbox использует предыдущее
Добрый день, у меня кнопачка записывает в файл значение текстбокса, только вот при повторном...

4
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
28.02.2014, 21:29 2
Попробуйте вот это
C#
1
pictureBoxSky.Refresh();
убрать.
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
28.02.2014, 21:42  [ТС] 3
Цитата Сообщение от insite2012 Посмотреть сообщение
Попробуйте вот это убрать.
Мимо)
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
28.02.2014, 22:15 4
Лучший ответ Сообщение было отмечено fenix117 как решение

Решение

Поставьте брейк на методе отрисовки, пошагово зайдите в метод и посмотрите свойства звезд в листе. Координаты каждой звезды. Координаты одинаковые...

Добавлено через 4 минуты
И это из-за того, что Random неверно используете. Поставьте ему диапазон.

Добавлено через 5 минут
Вот, самое простое решение. В цикле создания поставьте небольшую задержку, миллисекунд на 10, и все должно работать.
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
28.02.2014, 23:26  [ТС] 5
Цитата Сообщение от insite2012 Посмотреть сообщение
это из-за того, что Random неверно используете.
А ведь не первый раз на эти грабли наступаю
Цитата Сообщение от insite2012 Посмотреть сообщение
Поставьте ему диапазон.
Не прокатит. Нашел на этом же форуме класс для генерации неповторяющегося рандома:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Stars
{
    public class RandomNotRepeat : System.Random
    {
        int _min, _max;
        Stack<int> list;
        /// <summary>
        /// Инициализирует новый экземпляр класса System.Random с помощью зависимого
        //  от времени начального значения по умолчанию.
        /// </summary>
        /// <param name="min">Включенной нижний предел возвращаемого случайного числа.</param>
        /// <param name="max">Исключенный верхний предел возвращаемого случайного числа. Значение maxValue должно быть больше или равно значению minValue.</param>
        public RandomNotRepeat(int minValue, int maxValue)
        {
            _max = maxValue;
            _min = minValue;
            genList();
        }
        /// <summary>
        /// Генерация списка исключений
        /// </summary>
        protected void genList()
        {
            System.Random rand = new System.Random();
            List<int> temp = new List<int>();
            for (int i = _min; i < _max; i++)
            {
                temp.Add(i);
            }
            list = new Stack<int>();
            while (temp.Count > 0)
            {
                int addInt = temp[rand.Next(0, temp.Count)];
                list.Push(addInt);
                temp.Remove(addInt);
            }
        }
        /// <summary>
        /// Возвращает неотрицательное случайное число.
        /// </summary>
        /// <returns>32-разрядное целое число со знаком большее или равное minValue и меньше, чем maxValue; то есть, диапазон возвращаемого значения включает minValue, не включает maxValue. Если значение параметра minValue равно значению параметра maxValue, то возвращается значение minValue.</returns>
        public override int Next()
        {
            if (list.Count > 0)
            {
                return list.Pop();
            }
            else
            {
                genList();
            }
            return list.Pop();
        }
 
    }
}
Но перед вызовом приходиться ждать около 5 миллисекунд:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static Star GetRandom(int widht, int height)
        {
            Star Rez = new Star();
            Thread.Sleep(5);
            RandomNotRepeat A = new RandomNotRepeat(0, widht);
            Rez.x = (float)A.Next() % widht;
            Thread.Sleep(5);
            RandomNotRepeat B = new RandomNotRepeat(0, height);
            Rez.y = (float)B.Next() % height;
            Thread.Sleep(5);
            RandomNotRepeat Col = new RandomNotRepeat(50, 255);
            Rez.color = Color.FromArgb((int)Col.Next(), (int)Col.Next(), (int)Col.Next());
            return Rez;
        }
Добавлено через 59 секунд
Иначе значений 4-5 подряд идут одинаковые

Добавлено через 5 минут
Хотя и двух миллисекунд вроде достаточно
0
28.02.2014, 23:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2014, 23:26
Помогаю со студенческими работами здесь

Почему при повторном открытии OpenFileDialog сохраняется предыдущее имя файла
Вобщем программирую кнопку cmdOfile для открытия диалогового окна, после открытия окна, в поле Имя...

Текст на PictureBox стирается при сворачивании-разворачивании окна
Здравствуйте! У меня создается динамически несколько Picturebox. PictureBox vichisl = new...

Рисование с помощью Line и Pset при сворачивании формы все стирается
Может ли кто-нибудь подсказать почему при рисовании методами Line and pset рисунок стирается если...

Ошибка переполнения при рисовании на PictureBox
Всем привет, помогите разобраться с кодом. Постоянно выдает ошибку overflow. Заранее спасибо! ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru