![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 02.06.2010
Сообщений: 5
|
![]()
Недавно занялся Дельфями, ради интереса и получения опыта соорудил совершенно бессмысленную программку, которая при запуске рисует прямо на Canvas'e формы "пейзаж". Собсно, дальше хочу добавить кнопку по которой "солнце" будет перемещаться...
![]() Но возникли два вопроса от которых уже весь мозг распух: 1. Насущный - перерыл кучу веток форумов, но так и не нашёл решения: При выполнении программы, когда окно формы перекрывается другим окном, выходит за границы экрана, сворачивается-разворачивается в панель задач и разворачивается кнопкой во весь экран, изображение не отрисовывается и остаются чистые области. Пробовал присобачить эту же процедуру к событию OnPaint формы, но тогда Canvas формы безостановочно рисуется и съедает всё время процессора! А как эту перерисовку сделать грамотно?? ![]() 2. Забавный - эта проблема меня ваще сконфузила: При выполнении программы, изменяя горизонтальные размеры формы все размеры фигур пересчитываются и пропорционально перерисовываются, но при изменении вертикальных размеров - все фигуры отрабатывают правильно, кроме "солнца" - его размеры почему-то не меняются! ![]() Вот, собсно, содержимое Unit1.pas: Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
по первому.
DoubleBuffered(или одна f) в OnCreate формы поставьте, и используйте OnPaint. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Регистрация: 02.06.2010
Сообщений: 5
|
![]() |
![]() |
![]() |
![]() |
#4 |
Регистрация: 02.06.2010
Сообщений: 5
|
![]()
По поводу второго вопроса до меня допёрло!
![]() Там, при вертикальном изменении размеров, ширина формы не изменяется, а вторая координата эллипса "солнца" жёстко привязана к этой самой ширине формы! То есть, оно сдвигается, а размер его не изменяется! Вот глупость-то! ![]() Проблемку решил как-то сам ещё не понял как: Добавил некий коэффициент, почему-то пришедший в мои мысли: we := (wm+hm) div 13; И в расчёте эллипса написал такое: Ellipse(we, we, 2*we, 2*we); Последний раз редактировалось MindFreak; 08.06.2010 в 03:22. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 03.02.2010
Сообщений: 178
|
![]()
в OnResize вызывай Repaint, а процесс рисования перенеси в OnPaint и как уже сказали в OnCreate вставь DoubleBuffered:=true
|
![]() |
![]() |
![]() |
#6 |
Регистрация: 02.06.2010
Сообщений: 5
|
![]() |
![]() |
![]() |
![]() |
#7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
![]()
Убери
Код:
И вот еще. Зачастую при отрисовке на канве необходимо сохранять постоянство пропорций (решение см. во вложении). А иногда возникает проблема точности отрисовки. Для этого можно хрить координаты в Real, а округлять только при вызове процедуры отрисовки. Это не очень хорошее решение (увеличивает нагрузку), но для простых чертежей (думаю до 1000-2000 элементов) более чем достаточное. Последний раз редактировалось Sibedir; 08.06.2010 в 18:24. |
![]() |
![]() |
![]() |
#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 |