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

Вниз

Вопрос по 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 вся ветка

Текущий архив: 2008.11.16;
Скачать: CL | DM;

Наверх




Память: 0.46 MB
Время: 0.005 c
15-1221653419
Правильный$Вася
2008-09-17 16:10
2008.11.16
thank you - дзенкую - дякую


15-1221631697
infom
2008-09-17 10:08
2008.11.16
Найти угол между векторами.


8-1187769846
ZMRaven
2007-08-22 12:04
2008.11.16
Поганое изображение.


2-1223026415
Развёртка
2008-10-03 13:33
2008.11.16
Развернуть досовское окноий экран программы на весь экран


15-1221658793
Terasbetoni
2008-09-17 17:39
2008.11.16
3Д-движок, работающий с кривыми поверхностями.





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