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

Вниз

Стиль карандаша как в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.044 c
15-1250969752
Gordom
2009-08-22 23:35
2009.10.25
Обновление Adobe Flash


2-1250865488
Л.Д.
2009-08-21 18:38
2009.10.25
TListView


3-1228733026
patrick1968
2008-12-08 13:43
2009.10.25
Изменения в ADOQuery


2-1251168902
Sw
2009-08-25 06:55
2009.10.25
windows xp встроенный zip-архиватор


2-1251100957
@!!ex
2009-08-24 12:02
2009.10.25
Как проще всего сделать Wizard?





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