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

Вниз

Стиль карандаша как в DrawFocusRect???   Найти похожие ветки 

 
AndreyRu   (2008-09-09 12:09) [0]

Доброго времени суток Всем!
Подскажите пожалуйста как создать карандаш со стилем как у API функции DrawFocusRect! PS_DOT не подходит, мне нужна именно точечная линия. Заранее спасибо!


 
{RASkov} ©   (2008-09-09 12:29) [1]

procedure DDAProc (X,Y: Integer; Cnv: TCanvas); stdcall;
begin
 if Odd(X) or Odd(Y) then Cnv.Pixels[X,Y]:=clBlack else Cnv.Pixels[X,Y]:=Cnv.Brush.Color;
end;

procedure MyLine(Cnv: TCanvas; FromPoint, ToPoint: TPoint);
begin
 LineDDA(FromPoint.X, FromPoint.Y, ToPoint.X, ToPoint.Y, @DDAProc, Integer(Cnv));
end;

procedure TForm1.Button1Click(Sender: TObject);
 MyLine(Canvas, Point(10, 10), Point(100, 10));
 MyLine(Canvas, Point(100, 10), Point(100, 100));
 MyLine(Canvas, Point(100, 100), Point(10, 100));
 MyLine(Canvas, Point(10, 100), Point(10, 10));
end;


 
KilkennyCat ©   (2008-09-09 12:36) [2]


> {RASkov} ©   (09.09.08 12:29) [1]


не, не катит, надо, чтоб следующий цвет был цветом фона.


 
{RASkov} ©   (2008-09-09 12:44) [3]

> [2] KilkennyCat ©   (09.09.08 12:36)

Не понял шутку юмора :)

> чтоб следующий цвет был цветом фона.

Там же как раз цвет фона и используется поочередно с черным ;) Внимательнее смотрим на DDAProc)
Конечно сорри за моё форматирование(или его отсутствие) но вот так вот...
:)


 
KilkennyCat ©   (2008-09-09 12:48) [4]

гм... наверное. я не помню LineDDA


 
AndreyRu   (2008-09-09 12:50) [5]

Спасибо Вы мне очень помогли!


 
clickmaker ©   (2008-09-09 12:59) [6]

я бы рисовал сначала на битмапе. Попиксельный доступ к канве форме - не самый быстрый способ


 
{RASkov} ©   (2008-09-09 14:40) [7]

> я бы рисовал сначала на битмапе. Попиксельный доступ к канве
> форме - не самый быстрый способ

А этот способ будет еще медленнее.... Так как тот же попиксельный доступ к канве битмапа, только потом еще и копирование битмапа на канву формы(или куда там) - моргать меньше будет - да, но скорость не выше. Хотя я может и не правильно воспроизвел [6] в мозгу, но.... Имхо всё это...
А вообще в DDAProc можно наверное и скайлайн завертеть, тут я не помошник, мысль толкнул(в свое время эту мысль тут и почерпнул... Анатолий, помоему мне, или не мне, подсказал данную(LineDDA) "штучку"), а дальше нужно пробывать, реализовывать, оптимизировать, развивать....)


 
clickmaker ©   (2008-09-09 14:56) [8]

> А вообще в DDAProc можно наверное и скайлайн завертеть

ну да, разумеется


 
Юрий Зотов ©   (2008-09-10 08:37) [9]

А почему просто не вызвать DrawFocusRect?


 
Ins ©   (2008-09-11 12:41) [10]

Используй расширенные перья, вместо стандартных. Проблемка лишь в том, что в VCL нет их поддержки, но это решаемо:

procedure TForm1.FormPaint(Sender: TObject);
var
 PenHandle: HPEN;
 BrushStyle: tagLOGBRUSH;
 NewPen: TPen;
begin
 with Canvas do
 begin
   BrushStyle.lbStyle:=BS_SOLID;
   BrushStyle.lbColor:=ColorToRGB(Pen.Color);
   BrushStyle.lbHatch:=0;
   PenHandle:=ExtCreatePen(PS_GEOMETRIC or PS_DOT,Pen.Width,BrushStyle,0,nil);
   NewPen:=TPen.Create;
   try
     NewPen.Handle:=PenHandle;
     Canvas.Pen:=NewPen;
     MoveTo(0,100);
     LineTo(300,100);
   finally
     NewPen.Free;
   end;
 end;
end;


 
antonn ©   (2008-09-11 21:53) [11]


> А этот способ будет еще медленнее.... Так как тот же попиксельный
> доступ к канве битмапа, только потом еще и копирование битмапа
> на канву формы(или куда там) - моргать меньше будет - да,
>  но скорость не выше. Хотя я может и не правильно воспроизвел
> [6] в мозгу, но.... Имхо всё это...

я сейчас могу сказать ерунду, но мне кажется, что у form.canvas и у Tbitmap.canvas немного разные процессы происходят при рисовании :)
Уж не знаю, может там лочится/анлочится что то (смотреть мне сейчас лень), но операции над битмапом в памяти обычно куда быстрее, чем с канвасом на контролах.

провел небольшой тест, рандомом в квадрате 0,0,300,300 выбирались координаты и на них выставлялся рандомный цвет. В цикле 100К пикселей через canvas.pixels[], результат:
Form1.Canvas - 0,159835 секунд
bitmap.Canvas - 0,099619 секунд (с учетом копирования всего битмапа на канву формы, ниже тоже).
bitmap.Canvas с насильно выставленым pf32bit - 0,04614 секунд
bitmap.Canvas через сканлайн - 0,0248 секунд (учитывая, что выборка пикселей по случайным строкам)


 
KilkennyCat ©   (2008-09-12 00:32) [12]

ну вы даете... объяснение про скорости попиксельности в каждой книжке ж было... по крайней мере, для D7


 
antonn ©   (2008-09-12 00:37) [13]


> KilkennyCat ©   (12.09.08 00:32) [12]

что именно? кинь цитатку...


 
KilkennyCat ©   (2008-09-12 00:40) [14]

ну, что самый медленный - попиксельно, через буфер и флип - быстрее, через скайнлайн еще быстрее... цитату искать лень, я сие у тейксеры и пачеки читал, вроде, да и у остальных... в разделе "графика"



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
15-1251132830
Igor5
2009-08-24 20:53
2009.10.25
переход по формам в случайном порядке


9-1182962956
Dib@zol
2007-06-27 20:49
2009.10.25
Многоугольник


15-1251145808
Юрий
2009-08-25 00:30
2009.10.25
С днем рождения ! 25 августа 2009 вторник


2-1251913566
Shyrick
2009-09-02 21:46
2009.10.25
SQL-запрос


2-1251403436
LSE
2009-08-28 00:03
2009.10.25
ScanLine