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

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

14.09.2015, 13:45. Просмотров 433. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

4
Storm23
Эксперт .NETАвтор FAQ
6234 / 3739 / 1416
Регистрация: 11.01.2015
Сообщений: 4,906
Записей в блоге: 31
14.09.2015, 14:17 2
Анарион,
1) Всю прорисовку делайте в OnPaint формы (или контрола, на котором вы рисуете).
2) В конструктор формы вставьте строку:
C#
1
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
Пример кода есть здесь: При большом количестве контролов форма плохо прорисовывается
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
6234 / 3739 / 1416
Регистрация: 11.01.2015
Сообщений: 4,906
Записей в блоге: 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

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

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

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


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

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

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