Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для SeregaBarmaley
24 / 24 / 8
Регистрация: 01.10.2012
Сообщений: 204

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

06.04.2015, 07:45. Показов 2454. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2015, 07:45
Ответы с готовыми решениями:

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

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

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

13
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
06.04.2015, 08:42
SeregaBarmaley, временное решение - выполняй этот код в таймере, тоесть рисуй элипс постоянно либо в событии Form_Resize
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
06.04.2015, 08:43
Один из вариантов - рисовать в соответствующем событии

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
24 / 24 / 8
Регистрация: 01.10.2012
Сообщений: 204
06.04.2015, 09:30  [ТС]
Памирыч, братан, работает!

Добавлено через 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
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
06.04.2015, 09:49
Цитата Сообщение от SeregaBarmaley Посмотреть сообщение
Код блокирует таймер
Это как?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
06.04.2015, 09:58
SeregaBarmaley, и какой таймер
0
 Аватар для SeregaBarmaley
24 / 24 / 8
Регистрация: 01.10.2012
Сообщений: 204
06.04.2015, 10:06  [ТС]
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
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
06.04.2015, 10:11
Цитата Сообщение от SeregaBarmaley Посмотреть сообщение
Мне нужно чтобы в реальном времени рисунок обновлялся.
Процедуру прорисовки оставить без изменения, а в таймер
VB.NET
1
PictureBox1.Refresh
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
06.04.2015, 10:22
Цитата Сообщение от Памирыч Посмотреть сообщение
а в таймер

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Памирыч Посмотреть сообщение
Второй непонятный момент - какое отношение имеет свойство Image к нарисованному на компоненте?
Сам незнаю, но оно работает. А как ещё можно отчистить рисунок на PictureBox?
0
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
06.04.2015, 11:06
Лучший ответ Сообщение было отмечено 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
24 / 24 / 8
Регистрация: 01.10.2012
Сообщений: 204
07.04.2015, 10:28  [ТС]
да, вот это то что нужно, щас опробую более подробно

Добавлено через 23 часа 11 минут
Всё отлично работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2015, 10:28
Помогаю со студенческими работами здесь

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

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

Исчезает главная форма при активации из ее обработчика OnShow другой формы в модальном режиме
В главной форме событие OnShow, там прописано открытие другой формы Form4->ShowModal(). Но когда запускаю программу главная форма исчезает...

Почему исчезает рисунок в консоли после прокрутки?
// рассчитываю функцию и заполняю массивы x и y ... //Рисование POINT op; HWND hWnd = GetConsoleWindow(); HDC hDC = GetDC(hWnd); ...

на панеле задач каждые 2 минуты появляется значок шестеренки и исчезает, при этом исчезает полноэкранный режим
привет, на ноуте стоит win7, на панеле задач каждые 2 минуты появляется значок шестеренки и исчезает, при этом исчезает полноэкранный...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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