Главная страница
    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.036 c
7-1075633559
димка
2004-02-01 14:05
2004.04.25
список файлов


1-1081511947
Артем
2004-04-09 15:59
2004.04.25
Webbrowser


1-1081506710
Batoon
2004-04-09 14:31
2004.04.25
Помогите найти или сделать самму LISTBOX...


14-1080823703
SPeller
2004-04-01 16:48
2004.04.25
PE Viewer Ver 1.0


7-1078403652
mike_g
2004-03-04 15:34
2004.04.25
Работа с com портами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский