Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Анарион
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
#1

слишком частое обновление холста - C#

14.09.2015, 13:45. Просмотров 406. Ответов 4
Метки нет (Все метки)

было необходимо нарисовать некоторые детали на холсте канвы с помощью
C#
1
  Graphics G = drw.CreateGraphics();
drw -стандартный элемент- панель, или форма.
если форма уходит за пределы экрана или перекрывается элемент надо перерисовывать.
вставил вызов повторной отрисовки в событие Paint
да вот незадача, теперь то как раз при перекрытии все изображение возобновляется как следует, зато при обычном перетаскивании формы постоянно мигает, так как метод Paint почему то вызывается и при перетаскивании.
Как решить эту задачку, чтобы перерисовывать нужный элемент именно когда он исчезает из вида, а не при любом перетаскивании?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2015, 13:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос слишком частое обновление холста (C#):

WinForms: частое обновление картинки
Немного глуповатый вопрос, но все же сам видимо не решу, или решу нескоро. ...

DataGridView слишком медленно
Здравствуйте, у меня появилась проблема. Есть таблица, которая должна...

Слишком старый WebBrowser
Здравствуйте! При открытии страниц через WebBrowser, выдает что ваш браузер...

Максимально частое обновление экрана
Вечер добрый! Появилась необходимость использовать SDL2 и OpenGL под Виндой. Я...

Слишком долгое обновление
Windows 7 max x64. Установлена с нуля. Нелицензионная. Утром около 9 часов...

Запрос на обновление сопровождается ошибкой "Слишком мало параметров. Требуется 1"
Ну вот что ему еще надо: CurrentDb.Execute "UPDATE tbl_Inbox SET = " &...

4
Storm23
Эксперт .NETАвтор FAQ
5907 / 3506 / 1308
Регистрация: 11.01.2015
Сообщений: 4,616
Записей в блоге: 31
14.09.2015, 14:17 #2
Анарион,
1) Всю прорисовку делайте в OnPaint формы (или контрола, на котором вы рисуете).
2) В конструктор формы вставьте строку:
C#
1
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
Пример кода есть здесь: http://www.cyberforum.ru/windows-forms/thread1431945.html#post7537766
1
Анарион
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
14.09.2015, 19:42  [ТС] #3
так а я и делаю в нем. только оно называется просто Paint а что делает эта чудо -строчка?

Добавлено через 1 минуту
не помогло
C#
1
2
3
4
 public Form1()
        {
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
            InitializeComponent();
Добавлено через 5 часов 5 минут
пытался рисовать на элементе Panel что интересно на элементе Picture мигания нет. что же не так с Panel?
0
Storm23
Эксперт .NETАвтор FAQ
5907 / 3506 / 1308
Регистрация: 11.01.2015
Сообщений: 4,616
Записей в блоге: 31
14.09.2015, 20:32 #4
Цитата Сообщение от Анарион Посмотреть сообщение
пытался рисовать на элементе Panel
Строку SetStyle(...) нужно вставлять в конструктор того контрола, на котором вы рисуете.
Если вы хотите рисовать на Panel, то нужно создать свой UserControl, и в его конструкторе прописать SetStyle(...). Затем кинуть этот контрол на форму и на нем рисовать.
Строка SetStyle(...) включает режим двойной буферизации прорисовки и делает некоторые настройки для предотвращения мигания изображения.
Вот пример, в нем отрисовываются 1000 квадратиков на панели, ничего не мигает, не затирается:

WindowsFormsApplication309.zip
слишком частое обновление холста
1
Анарион
8 / 9 / 3
Регистрация: 18.11.2009
Сообщений: 676
14.09.2015, 21:26  [ТС] #5
нельзя ли все то же самое провернуть со страндартной панелью из визуальной панели инструментов (Panel)
если панель просто создается из панели инструментов можно как то к ее конструктору добраться, чтобы эту строчку вставить?

Добавлено через 12 минут
а как можно отобразить элемент собственного создания визуально прямо в конструкторе? не знал, что это возможно!

Добавлено через 2 минуты
замечу, если убрать из вашего кода эту строчку вообще:

C#
1
   SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
тоже ничего не мигает)))

Добавлено через 29 минут
аа, я понял! у меня с этим рисованием тоже проблем нет! у меня мигает при попытке перерисовать методом
C#
1
2
3
 G.FillRectangle(blueBrush, 50, 50, 50, 50);
            Bitmap bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.noC);
           G.DrawImage(bmp, 50, 50);
то есть когда форма перерисовывается необходимо очистить холст и заново нарисовать картинку, потому что если не очищать - ее края расплываются от многократной прорисовки. и вот тогда то она и мигает!
0
14.09.2015, 21:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2015, 21:26
Привет! Вот еще темы с решениями:

Размеры холста
Суть в том что при повороте изображения (осуществлён по пиксельно) изменяються...

класс холста
Здравствуйте всем. Пытаюсь реализовать класс "холста" или канвы. Задумывается...

Необычное поведение холста
Привет;) Возможно я слишком устал, ну или болен, не знаю. Но у меня не...

Выравнивание Canvas-холста
Возможно ли оно? не нашел информации если оно не возможно, то можно ли...


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

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

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