Рисование линий в win32 / GDI с помощью пользовательского стиля пера? - PullRequest
1 голос
/ 05 января 2010

Мне нужно сделать некоторые рисунки, используя win32 / GDI (Native, а не .NET), и я столкнулся со следующей проблемой:

Мне нужно нарисовать линии, которые «стилизованы». Например, на прилагаемом изображении линия, помеченная буквой «А», является прямой линией, поскольку это касается данных моего приложения, ее просто нужно нарисовать с помощью дополнительного зигзага в качестве стиля. Конечно, это легко сделать программно, но становится сложнее, когда линия может быть под любым углом («B») или даже кривой Безье («C»).

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

Можно ли просто присвоить windows / GDI «стиль» для применения к линии, возможно, растровое изображение, похожее на помеченное буквой «D», и использовать ли его в качестве ручки для рисования линий? Если нет, есть ли более гибкий и менее подверженный ошибкам способ сделать это, чем написание связки определенного кода для рисования для каждой из «стилизованных» линий?

* Видимо, новички не могут публиковать изображения. Примеры можно найти на http://i.imgur.com/IC0T2.png

Ответы [ 4 ]

3 голосов
/ 05 января 2010

Это невозможно в Win32 GDI. Вы должны будете сделать математику самостоятельно.

Следует отметить, однако, что вы можете получить точки, используемые для построения линии или кривой, что должно существенно облегчить ее.

См. Это учебное пособие по "Hit-Testing" для примера.

Для кривой Безье вы бы использовали Функции пути :

Для прямых линий вы можете использовать:

LineDDA

2 голосов
/ 05 января 2010

Насколько я знаю, в GDI или даже GDI + нет ничего, что могло бы это поддерживать. Единственные варианты линий, которые у вас есть, - это штриховые рисунки, составные ручки, штриховые, концевые и заливочные кисти.

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

Однако это не должно быть слишком сложно. Конечно, это займет день или около того, но все, что вам нужно сделать, это написать интерполятор линии и Безье, разделить кривые на равные сегменты, найти касательные во всех этих сегментах и ​​чередовать влево и вправо. Вы получите массив точек, которые можно очень быстро нарисовать в виде ломаной линии.

1 голос
/ 05 января 2010

Нет ничего, что сделает это автоматически. Вам придется написать код. Возможно, вы захотите взглянуть на LineDDA API в GDI. Это может упростить математику, которая понадобится вашему коду.

0 голосов
/ 05 января 2010

ExtCreatePen (), может быть? Я точно не знаю, поддерживает ли он зигзагообразность ...

...