|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.06.2010, 22:10 | #1 |
Регистрация: 02.06.2010
Сообщений: 5
|
Перерисовка Canvas
Недавно занялся Дельфями, ради интереса и получения опыта соорудил совершенно бессмысленную программку, которая при запуске рисует прямо на Canvas'e формы "пейзаж". Собсно, дальше хочу добавить кнопку по которой "солнце" будет перемещаться...
Но возникли два вопроса от которых уже весь мозг распух: 1. Насущный - перерыл кучу веток форумов, но так и не нашёл решения: При выполнении программы, когда окно формы перекрывается другим окном, выходит за границы экрана, сворачивается-разворачивается в панель задач и разворачивается кнопкой во весь экран, изображение не отрисовывается и остаются чистые области. Пробовал присобачить эту же процедуру к событию OnPaint формы, но тогда Canvas формы безостановочно рисуется и съедает всё время процессора! А как эту перерисовку сделать грамотно?? 2. Забавный - эта проблема меня ваще сконфузила: При выполнении программы, изменяя горизонтальные размеры формы все размеры фигур пересчитываются и пропорционально перерисовываются, но при изменении вертикальных размеров - все фигуры отрабатывают правильно, кроме "солнца" - его размеры почему-то не меняются! Вот, собсно, содержимое Unit1.pas: Код:
|
07.06.2010, 23:10 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
по первому.
DoubleBuffered(или одна f) в OnCreate формы поставьте, и используйте OnPaint. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
08.06.2010, 00:38 | #3 |
Регистрация: 02.06.2010
Сообщений: 5
|
|
08.06.2010, 01:43 | #4 |
Регистрация: 02.06.2010
Сообщений: 5
|
По поводу второго вопроса до меня допёрло!
Там, при вертикальном изменении размеров, ширина формы не изменяется, а вторая координата эллипса "солнца" жёстко привязана к этой самой ширине формы! То есть, оно сдвигается, а размер его не изменяется! Вот глупость-то! Проблемку решил как-то сам ещё не понял как: Добавил некий коэффициент, почему-то пришедший в мои мысли: we := (wm+hm) div 13; И в расчёте эллипса написал такое: Ellipse(we, we, 2*we, 2*we); Последний раз редактировалось MindFreak; 08.06.2010 в 03:22. |
08.06.2010, 11:27 | #5 |
Форумчанин
Регистрация: 03.02.2010
Сообщений: 178
|
в OnResize вызывай Repaint, а процесс рисования перенеси в OnPaint и как уже сказали в OnCreate вставь DoubleBuffered:=true
|
08.06.2010, 17:36 | #6 |
Регистрация: 02.06.2010
Сообщений: 5
|
|
08.06.2010, 17:59 | #7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Убери
Код:
И вот еще. Зачастую при отрисовке на канве необходимо сохранять постоянство пропорций (решение см. во вложении). А иногда возникает проблема точности отрисовки. Для этого можно хрить координаты в Real, а округлять только при вызове процедуры отрисовки. Это не очень хорошее решение (увеличивает нагрузку), но для простых чертежей (думаю до 1000-2000 элементов) более чем достаточное. Последний раз редактировалось Sibedir; 08.06.2010 в 18:24. |
08.06.2010, 22:50 | #8 |
Регистрация: 02.06.2010
Сообщений: 5
|
Спасибо огромное!
Вот, как раз уже само допёрло, что проблема в рефреше и вместо Form1.Refresh я написал: Код:
Последний раз редактировалось MindFreak; 08.06.2010 в 23:03. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перерисовка окна | _Dmitry_ | Win Api | 3 | 30.03.2010 19:55 |
Перерисовка TlistBox | DarkEN_ANGEL | Компоненты Delphi | 4 | 26.01.2010 23:04 |
Перерисовка канвы | Bayazet | Мультимедиа в Delphi | 4 | 09.04.2009 22:14 |
перерисовка канвы | Bayazet | Общие вопросы Delphi | 14 | 27.01.2009 16:02 |
Перерисовка на Image | SERG1980 | Мультимедиа в Delphi | 9 | 09.04.2008 10:24 |