powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дайте пример функции для рисования Dashed Line
11 сообщений из 11, страница 1 из 1
Дайте пример функции для рисования Dashed Line
    #39802586
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, нужна функция для рисования Dashed Line (линии из черточек), в которой я бы мог изменять размер черточек и расстояния между ними. Стандартный TCanvas не умеет, у него заранее определенные значения. Желательно без использования Windows-специфичных функций :)
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802592
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20 долларов/час, и я тебе напишу такую функцию
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802599
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Написать я и сам могу, думал может у кого есть готовые примеры или хотя бы алгоритм, дабы не рыться самому.
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802630
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know, так взлетит?

How to draw custom dashed/dotted lines on a canvas.
https://edn.embarcadero.com/article/26475
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802658
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдI dont know, так взлетит?Что-то ссылка не открылась. А вообще, это элементарно делается через GDI+. В наших компонентах такое используется.
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802677
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,
Эту ссылку находил, не открывается. Сейчас медитирую над Брезенхемом и Ву...
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802710
MBo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBo
Гость
I dont know,
TCanvas умеет: ExtCreatePen
(Какие-то вещи удобнее с LineDDA)

https://stackoverflow.com/questions/13789474/draw-a-line-on-canvas-with-custom-style-delphi
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802725
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBo,

Это GDI-ая функция, не по феншую (
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802743
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerКвейдI dont know, так взлетит?Что-то ссылка не открылась. А вообще, это элементарно делается через GDI+. В наших компонентах такое используется.

а я смог :) http://webcache.googleusercontent.com/search?q=cache:ImWkc31QcngJ:https://edn.embarcadero.com/article/26475&hl=de&gl=de&strip=1&vwsrc=0


How to draw custom dashed/dotted lines on a canvas.

By: Vincent Drake

Abstract: Describes the use of ExtCreatePen to customize the length of your dotted lines.

Question:

Can I create custom dotted and dashed lines when drawing to the canvas? The Pen styles psDashed and psDotted don't look right for my purposes.

Answer:

The VCL doesn't directly provide this function, but it is available to you through the Windows API function ExtCreatePen. The following example demonstrates the use of this function. The example creates a pen with a dash pattern that incrementally gets longer. The created pen handle is then assigned to the canvas pen, then the line is drawn.

Example:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        LOGBRUSH lbrush = { BS_SOLID, RGB(0,0,0), NULL};
        DWORD userstyle[] = {2, 2, 4, 4, 8, 8, 16, 16, 32, 32};

        Canvas->Pen->Handle = ExtCreatePen(PS_COSMETIC | PS_USERSTYLE, 1, &lbrush, 10, userstyle);
        Canvas->MoveTo(0, 0);
        Canvas->LineTo(400, 400);
}
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802784
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён,

ему руками надо. В битовой карте, без обращения к ОС.
...
Рейтинг: 0 / 0
Дайте пример функции для рисования Dashed Line
    #39802807
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока, с помощью интернетов и небольших раздумий набросал так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
procedure TForm1.DrawLine(c : TCanvas; x1,y1,x2,y2 : Integer);
var
    dx, dy, s, sx, sy, err, e2: integer;
    ds, es, i, j : integer;
    procedure _swap(out a, b : integer);
    var
        t : integer;
    begin
        t := a;
        a := b;
        b := t;
    end;
begin

    ds := 5; // dash size
    es := 2; // empty size

    if x1 > x2 then
    begin
        _swap(x1, x2);
        _swap(y1, y2);
    end;

    dx := abs(x2 - x1);
    dy := -abs(y2 - y1);

    if x1 < x2 then sx := 1 else sx := -1;
    if y1 < y2 then sy := 1 else sy := -1;
    err := dx+dy;

    i := 0;
    j := 0;
    while x1 < x2 do begin
        if i <= ds then begin
            c.Pixels[x1, y1] := clBlack;
            inc(i);
        end
        else begin
            if j = es then begin
                i := 0;
                j := 0
            end
            else
                inc(j);
        end;

        e2 := 2*err;

        if (e2 >= dy)  then begin
            err := err + dy;
            x1 := x1 + sx;
        end; // e_xy+e_x > 0

        if (e2 <= dx) then begin
            err := err + dx;
            y1 := y1 + sy;
        end; // e_xy+e_y < 0
    end;
end;                                                        



Корявенько и есть проблемы с пустотами между черточками, но в первом приближении пойдёт )
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Дайте пример функции для рисования Dashed Line
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]