Странности с перерисовкой

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Странности с перерисовкой

Сообщение Viper » 23.03.2006 (Чт) 18:50

Делаю свой контрол. На поле контрола располагается PictureBox. На пиктербоксе и на самом поле контрола выводится графика.

Естественно, что при событии OnPaint вся эта графика должна перерисовыватся. Но происходит странное, та графика, что выводится на самом поле контрола выводится нормально, а вот графика на пиктербоксе вначале выводится, а потом стирается :(... Самое интересное, что при вызове функции перериосовки из других частей кода, например из OnResize все выводится нормально...

Что бы это значило и как с этим боротся? Чувствую, что все очень просто, но ... никак до этого простого не додумаю
Весь мир матрица, а мы в нем потоки байтов!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 23.03.2006 (Чт) 20:50

Подозреваю что ты выполняешь всю прорисовку в событии OnPaint твоего контрола. А как же OnPaint для PictureBox?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 24.03.2006 (Пт) 10:27

В первую очередь рекомендую рисовать всю графику на контроре без PictureBox

Проблема решится если в процедуру New после InitializeComponent() добавить вот это

Код: Выделить всё

       Me.SetStyle(ControlStyles.ResizeRedraw, True)
       Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
       ' This helps with drawing the control so that it doesn't flicker
       Me.SetStyle(ControlStyles.DoubleBuffer _
          Or ControlStyles.UserPaint _
          Or ControlStyles.AllPaintingInWmPaint,  True)
       Me.UpdateStyles()

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.03.2006 (Пт) 12:05

Nord777 писал(а):А как же OnPaint для PictureBox?
И этот OnPaint не забыт :D
Весь мир матрица, а мы в нем потоки байтов!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 24.03.2006 (Пт) 12:09

2 temur, код вставил - эффекта 0. :( Совет насчет рисования всего без PictureBox конечно хорош, но неприменим в данном случае
Весь мир матрица, а мы в нем потоки байтов!

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 24.03.2006 (Пт) 12:24

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

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 24.03.2006 (Пт) 12:25

Или попробуй OnPaintBackground для контрола контейнера.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 25.03.2006 (Сб) 7:19

Как всегда все оказалось гораздо проще... Низзя в обработчике OnPaint контрола (PictureBox'а в данном случае) использовать объект Graphics полученный через CreateGraphics, можно юзать только предоставленный в аргументе события... :oops:

З.Ы. Но что интересно в обработчике OnPaint контейнера можно юзать Graphics полученный любым способом

З.З.Ы. То же самое касается и ситуации, когда перерисовывается контрол расположенный на форме, или на другом контейнере...
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

    TopList