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

Вниз

Вопрос по Canvas   Найти похожие ветки 

 
Vinum   (2007-11-22 13:07) [0]

Всем добрый день. Вопрос в следующем. У меня на панели есть несколько линий такого характера черного света:
form1.Panel1.Canvas.moveto(x1,y1);
form1.Panel1.Canvas.lineto(x2,y2);
Когда мышью шелкаю по линии, она выделяется красным.
Вопрос: как мне сделать так, чтобы при зажатой ЛКМ и перемещении мыши по панели линия тащилась и не оставляла за собой следов перемещения и не стирала остальные линии.
Спасибо.


 
homm ©   (2007-11-22 13:20) [1]

Рисовать в OnPaint, изменять координаты и посылать команду на перерисовку в OnMouseMove.


 
Vinum   (2007-11-22 15:18) [2]

Очень сильно моргает панель, а если стирание осуществлять только в окрестности перемещаемой линии, то при быстром движении мышкой не успевает все стираться и остаются следы. может можно как-то это обойти??


 
Barloggg   (2007-11-22 15:25) [3]

сохраняй координаты мыши при последней отрисовке.

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

В общем читай как сказал homm [1], но подходи к этому творчески.
То есть создай один глобальный битмап с канвасом, дай ему размер как на твоей панели и все отрисовки веди только на него.
А при OnPaint делай копию на панель.

Кстати перекрыть событие OnEraseBkgnd тоже имеет смысл. Создай процедуру-пустышку и назначь. Должно помочь против мерцания.


 
homm ©   (2007-11-22 15:38) [4]

> [3] Barloggg   (22.11.07 15:25)
> То есть создай один глобальный битмап с канвасом, дай ему
> размер как на твоей панели и все отрисовки веди только на
> него.

А зачем? Если построение изоббражение не сложное, то то-же самое — DoubleBuffered = true;


 
Vinum   (2007-11-22 16:42) [5]

>Кстати перекрыть событие OnEraseBkgnd
>тоже имеет смысл. Создай процедуру-
>пустышку и назначь.

Не понял как перекрыть и что назначить :)

procedure TForm1.Panel1EraseBkgnd(Sender: PControl; DC: HDC);
begin
// какой код нужно написать?
end;


 
homm ©   (2007-11-22 22:39) [6]

procedure TForm1.Panel2Paint(Sender: PControl; DC: HDC);
var
 tR: TRect;
begin
 with Sender.Canvas^ do begin
   FillRect(Sender.ClientRect);
   Pen.Color := clRed;
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X+20, CurPoint.Y+20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X+20, CurPoint.Y);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X, CurPoint.Y+20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X-20, CurPoint.Y-20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X-20, CurPoint.Y);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X, CurPoint.Y-20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X+20, CurPoint.Y-20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X-20, CurPoint.Y+20);
 end;
end;

procedure TForm1.Panel5MouseMove(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if MDown then begin
   CurPoint := MakePoint(Mouse.X, Mouse.Y);
   Panel5.Invalidate;
 end;
end;

procedure TForm1.Panel5MouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 MDown := TRUE;
end;

procedure TForm1.Panel5MouseUp(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 MDown := FALSE;
end;


Нет мерцаний. Сделано в точночти, как в [1].


 
Vinum   (2007-11-23 15:01) [7]

Спасибо, я счастлив



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

Форум: "KOL";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.013 c
15-1221765851
Sergio666
2008-09-18 23:24
2008.11.16
Delphi 2007 и символ подчеркивания


2-1223130000
Dr. Genius
2008-10-04 18:20
2008.11.16
InputQuery – ввод пароля


2-1223539684
aslanbek
2008-10-09 12:08
2008.11.16
Регистрация расширения в реестре


4-1200404732
Lamer666
2008-01-15 16:45
2008.11.16
FindWindowEx не находит кнопку в ОКНЕ


2-1223362300
123-ий
2008-10-07 10:51
2008.11.16
Экранирование одинарной кавычки





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