Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
SeregaBarmaley
23 / 23 / 8
Регистрация: 01.10.2012
Сообщений: 204
1

Исчезает рисунок при прорисовке формы

06.04.2015, 07:45. Просмотров 860. Ответов 13
Метки нет (Все метки)

Здравствуйте.

Создаём на форме PictureBox с именем picMain и размерами 300x300. Создаём кнопку с именем btnPaint и размещаем в ней программный код.

vb.net
1
2
3
4
    Private Sub btnPaint_Click(sender As System.Object, e As System.EventArgs) Handles btnPaint.Click
        Dim redPen As New Pen(Color.Red, 1)
        picMain.CreateGraphics.DrawEllipse(redPen, 1, 1, 100, 50)
    End Sub
После нажатия на кнопку на форме PictureBox появляется красный эллипс. И всё бы ничего, но если подвести мышкой форму к краю экрана, а потом вернуть назад, то часть эллипса стирается. Стирается всё нарисованное и если свернуть форму, а затем развернуть.

Вопрос: как программно рисовать без стирания нарисованного?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2015, 07:45
Ответы с готовыми решениями:

При создании базы данных Microsoft SQL Server Compact 3.5 нажимаю кнопку создать и окно просто исчезает
При создании базы данных Microsoft SQL Server Compact 3.5 нажимаю кнопку...

MS Sql: при добавлении новой записи, информация из первой записи в таблице исчезает
Ошибка заключается в том, что при добавлении новой записи(через программу),...

MDI-формы. Максимизация окна при загрузке формы
Товарищи программисты! Случилась следующая проблема: я делаю приложение,...

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

Подвисание при прорисовке формы
Доброго времени суток. Возникала такая проблема. Раньше никогда не писал...

13
Yury Komar
Модератор
Эксперт .NET
2387 / 2192 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
06.04.2015, 08:42 2
SeregaBarmaley, временное решение - выполняй этот код в таймере, тоесть рисуй элипс постоянно либо в событии Form_Resize
0
Памирыч
Почетный модератор
20893 / 8777 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
06.04.2015, 08:43 3
Один из вариантов - рисовать в соответствующем событии

vb.net
1
2
3
4
    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim redPen As New Pen(Color.Red, 1)
        e.Graphics.DrawEllipse(redPen, 1, 1, 100, 50)
    End Sub
2
SeregaBarmaley
23 / 23 / 8
Регистрация: 01.10.2012
Сообщений: 204
06.04.2015, 09:30  [ТС] 4
Памирыч, братан, работает!

Добавлено через 37 минут
Появилась проблема.

Код блокирует таймер

vb.net
1
2
3
4
  Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim redPen As New Pen(Color.Red, 1)
        e.Graphics.DrawEllipse(redPen, 1, 1, 100, 50)
    End Sub
0
Памирыч
Почетный модератор
20893 / 8777 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
06.04.2015, 09:49 5
Цитата Сообщение от SeregaBarmaley Посмотреть сообщение
Код блокирует таймер
Это как?
0
Yury Komar
Модератор
Эксперт .NET
2387 / 2192 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
06.04.2015, 09:58 6
SeregaBarmaley, и какой таймер
0
SeregaBarmaley
23 / 23 / 8
Регистрация: 01.10.2012
Сообщений: 204
06.04.2015, 10:06  [ТС] 7
vb.net
1
2
3
4
5
6
7
8
9
    Private Sub picMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picMain.Paint
        picMain.Image = Nothing 'Блокирует таймер
        Dim redPen As New Pen(Color.Red, 1)
        e.Graphics.DrawEllipse(redPen, 1, 1, 100, 50)
    End Sub
 
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        lblTimeNow.Text = CStr(TimeOfDay)
    End Sub
Добавлено через 50 секунд
Если эту штуку убрать, то всё нормально и часы на форме видны хорошо.
vb.net
1
picMain.Image = Nothing
Добавлено через 2 минуты
Как в PictureBox стирать нарисованное?
Мне нужно чтобы в реальном времени рисунок обновлялся.
0
Памирыч
Почетный модератор
20893 / 8777 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
06.04.2015, 10:11 8
Цитата Сообщение от SeregaBarmaley Посмотреть сообщение
Мне нужно чтобы в реальном времени рисунок обновлялся.
Процедуру прорисовки оставить без изменения, а в таймер
vb.net
1
PictureBox1.Refresh
0
Yury Komar
Модератор
Эксперт .NET
2387 / 2192 / 349
Регистрация: 27.01.2014
Сообщений: 3,925
Завершенные тесты: 1
06.04.2015, 10:22 9
Цитата Сообщение от Памирыч Посмотреть сообщение
а в таймер

vb.net
1
PictureBox1.Refresh
у меня блокирует...
а если вот это в таймер
vb.net
1
    picMain.Image = Nothing
то все в порядке работает
0
SeregaBarmaley
23 / 23 / 8
Регистрация: 01.10.2012
Сообщений: 204
06.04.2015, 10:46  [ТС] 10
У меня программа очень большая, и если ставить в таймер очистку
vb.net
1
picMain.Image = Nothing
то рисунок начинает мерцать: каждую секунду он стирается и отрисовывается.
0
Памирыч
Почетный модератор
20893 / 8777 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
06.04.2015, 10:55 11
Я недопонимаю цель.
Зачем очищать пикчербокс, если он и так перерисовывается "с нуля" каждый раз?
Второй непонятный момент - какое отношение имеет свойство Image к нарисованному на компоненте?
Отрисовка идет не на Image и не на BackgroundImage, она идет прямо на самом компоненте.

Хотя, признаться, я и сам не в понятках, почему останавливается таймер, он вообще с боку припеку, казалось бы
0
SeregaBarmaley
23 / 23 / 8
Регистрация: 01.10.2012
Сообщений: 204
06.04.2015, 11:03  [ТС] 12
PictureBox не перерисовывается каждый раз. После запуска программы нужно сворачивать и разворачивать, чтобы рисунок обновился, когда в непосредственно в программе изменяешь переменные. Для этого и нужна процедура очистки бокса. Если на таймер поставить
vb.net
1
picMain.Image = Nothing
то всё хорошо работает.
Только если программа большая, то он будет мерцать.

Вопрос: как программно рисовать без стирания нарисованного?

Цитата Сообщение от Памирыч Посмотреть сообщение
Один из вариантов - рисовать в соответствующем событии
Какие есть ещё варианты?

Добавлено через 1 минуту
Цитата Сообщение от Памирыч Посмотреть сообщение
Второй непонятный момент - какое отношение имеет свойство Image к нарисованному на компоненте?
Сам незнаю, но оно работает. А как ещё можно отчистить рисунок на PictureBox?
0
Памирыч
Почетный модератор
20893 / 8777 / 1080
Регистрация: 11.04.2010
Сообщений: 11,013
06.04.2015, 11:06 13
Лучший ответ Сообщение было отмечено SeregaBarmaley как решение

Решение

SeregaBarmaley, есть вариант с Bitmap

Преимущества - ничего не пропадает, можно добавлять новые графические элементы. Не привязан к событию Paint

vb.net
1
2
3
4
5
        Dim BM As New Bitmap(PictureBox1.Width, PictureBox1.Height)
        Dim G As Graphics = Graphics.FromImage(BM)
        Dim redPen As New Pen(Color.Red, 1)
        G.DrawEllipse(redPen, 1, 1, 100, 50)
        PictureBox1.Image = BM
2
SeregaBarmaley
23 / 23 / 8
Регистрация: 01.10.2012
Сообщений: 204
07.04.2015, 10:28  [ТС] 14
да, вот это то что нужно, щас опробую более подробно

Добавлено через 23 часа 11 минут
Всё отлично работает.
0
07.04.2015, 10:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2015, 10:28

Исчезает фоновый рисунок
После того как я поиграю в фифа 10 он исчезает

Исчезает фоновый рисунок экрана
Добрый день! Помогите, пожалуйста. Смысл неприятности вот в чем: После...

Рисование на форме. Исчезает рисунок
Привет всем, Вот мучаюсь с рисунком, все никак не получается, почему то...


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

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

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