Проблемы с использованием неподдерживаемых режимов Win32 GDI Pens? - PullRequest
1 голос
/ 30 октября 2008

В документации MSDN (в некоторой степени) четко изложены следующие два факта о ручках GDI:

  1. Косметическое перо (созданное с помощью CreatePen или ExtCreatePen с PS_COSMETIC) должно иметь ширину 1 (ну, <= 1, но давайте не будем там). </p>

  2. Геометрическое (ExtCreatePen w / PS_GEOMETRIC) перо должно быть сплошным (только PS_SOLID, без PS_DASH и т. Д.). Однако они могут рисовать жирные линии. Это ясно задокументировано в ссылке, которую я поставил выше, только как ограничение 9x (я тупой). К моей защите (плохие) комментарии и (сломанная) логика в моем коде заставили меня поверить в обратное. Некоторые другие статьи с гуглом должны быть написаны, учитывая только Windows 9x.

Почему я могу нарушить эти правила и сделать так, чтобы GDI счастливо рисовал этими ручками?

Я могу создать жирные (например, ширину = 10) косметические ручки и пунктирные геометрические ручки. Черт возьми, я могу создать жирную, пунктирную геометрическую ручку!

Эти ручки работают нормально , обычно . Единственная проблема, с которой я столкнулся, - в Polyline, когда я пропускаю очень большие массивы точек - он очень медленно отрисовывает линии. Тем не менее, Polyline ведет себя странно с большими массивами в целом - он работает по-разному с bad ручками. (другие мои проблемы с полилинией могут быть другим вопросом ...)

Всегда ли безопасно использовать широкие косметические ручки или широкие геометрические с узорами?

1 Ответ

1 голос
/ 31 октября 2008

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

Ограничения ExtCreatePen, которые вы описываете (например, нет PS_DASH с PS_GEOMETRIC), применяются только к Win9x, а не к WinNT, поэтому в NT / 2000 / XP ваша «жирная, пунктирная геометрическая ручка» не должна быть проблема. Также обратите внимание, что Polyline имеет некоторые ограничения для Win9x.

Если вам нужны пунктирные линии, я бы предложил использовать PS_USERSTYLE, чтобы контролировать длину штрихов и пробелов, а не полагаться на то, что дает PS_DASH по умолчанию.

...