Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Вниз

Перерисовка компонента TPaintBox   Найти похожие ветки 

 
KommandorDi ©   (2004-04-05 22:39) [0]

Добрый вечер! У меня возник такой вопрос: Я рисую на TPaintBox кривую Безье по опорным точкам (суть объекты TShape) и надо, чтобы при смещении одной из опорных точек кривая тут же перерисовывалсь. Но без стирания предыдущей кривой (как она была нарисована) все поле TPaintBox заполняется штрихами и ничего не понять.
Вызов же PaintBox1.Canvas.FillRect(PainBox1.BoundRect)
перекрывает ВСЕ что находится "выше" TPaintBox цветом кисти.
При этом перекрываются (закрашиваются) и объекты от TShape.
Как избежать их "стирания"?
Может их можно потом как-нбудь отобразить заново?
Заранее благодарен


 
Ломброзо ©   (2004-04-05 22:52) [1]

Аккуратно xor-им предыдущую линию. Пример есть в /Demos, какой-то там простенький графический редактор.


 
Ломброзо ©   (2004-04-05 22:53) [2]

в смысле, старую линию, в MouseMove.


 
KommandorDi ©   (2004-04-05 22:55) [3]

Никак!
Для экономии немалого (!) места в памяти и для избавления от больших массивов я получаю координаты каждой точки в одной и той же переменной. Поэтому старую линию я получить таким образом не могу.
А при изменении координаты лбой из опорных точек на 1px в методе MouseMove вызывается перерисовка кривой. :(


 
Ломброзо ©   (2004-04-05 23:02) [4]

Ситуация: есть одна точка, есть вторая. Между ними по какому-то известному закону проведена кривая, которую Вы отрисовали, пусть чёрным цветом по белому. Теперь перед перемещением одной из точек рисуем ту же самую линию, только белым по белому. Она, разумеется, исчезает с канвы. Передвигаем другую точку и снова рисуем Вашу кривую Безье, опять-таки чёрным по белому. Вот и весь принцип. Насколько я понимаю, кривая меняется не только между двигаемой точкой и двумя соседними, но и ещё между двумя-тремя соседними с обеих сторон - так то же самоё.


 
KommandorDi ©   (2004-04-05 23:02) [5]

И еще: я сделал "в лоб":

Procedure DrawCurve();
begin
   Form1.pbField.Canvas.FillRect(Form1.pbField.BoundsRect);
...
//рисование кривой
...
end;

А в свойстве PaintBox1.OnPaint прописал:
DrawCurve()
При этом при работе приложения кривая выглядит нормально, все перерисовывается, но сами опорные точки (TShape) постоянно мигают, как будто их перерисовывает метод OnPaint от PaintBox1.
Что тут делать? Можно ли это использовать?


 
Ломброзо ©   (2004-04-05 23:05) [6]

всё же все точки надо хранить в каких-нибудь шустрых и удобных контейнерах навроде TList, позволяющих быструю вставку-удаление элементов. Динамический массив тут как-то не очень хорош. На то она и кривая Безье, что интерполяция хорошая для мЕньшего количества точек.


 
KommandorDi ©   (2004-04-05 23:08) [7]

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


 
KommandorDi ©   (2004-04-05 23:10) [8]

все! мигание пропало!
Видать руки не совсем кривые!
спасибо огромное!


 
Ломброзо ©   (2004-04-05 23:12) [9]

При отлове OnPaint не нужно перерисовывать весь клиентский прямоугольник контрола, а только ту область, которая подлежит перерисовке, остальные можно оставить в покое. См. TCanvas.ClipRect.


 
Кулясов ©   (2004-04-05 23:20) [10]

Весьма спорно использование TShape в этом случае.


 
Ломброзо ©   (2004-04-05 23:22) [11]

Мы знаем, но это уже другой вопрос, да?


 
Кулясов ©   (2004-04-05 23:56) [12]

Точно.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.05 c
1-1081230836
viktor
2004-04-06 09:53
2004.04.25
3,5A


3-1080570274
stud
2004-03-29 18:24
2004.04.25
выполнение запросов?


1-1081586948
Insert
2004-04-10 12:49
2004.04.25
Проигрывание *.mov


1-1081586866
jiuraf
2004-04-10 12:47
2004.04.25
Программа для тестирований приложений


14-1081095659
Verg
2004-04-04 20:20
2004.04.25
Объясните, кто знает, про F1





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский