Форум: "Основная";
Текущий архив: 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