Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Перерисовка компонента 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1080634026
Фикус
2004-03-30 12:07
2004.04.25
Вопрос по Excel


3-1080534305
russko
2004-03-29 08:25
2004.04.25
Record locked by another user


14-1080795041
han_malign
2004-04-01 08:50
2004.04.25
Да, жестокие у народа шутки


3-1080539971
Orc
2004-03-29 09:59
2004.04.25
Лист Excel


3-1080215520
Fishka
2004-03-25 14:52
2004.04.25
Constraint и Exists