2015-08-27 2 views
0

Я работаю над проектом, который позволяет рисовать объекты на карте в C#. Мы используем собственный созданный True Typed Font (.ttf). Причина этого в том, что пользователи должны иметь возможность указывать свои собственные значки для объектов, если они этого захотят.Можно ли заполнить письмо графическим классом в C#?

Шрифт (письмо) Я в настоящее время рисунок является указано на карте маркер, как вы можете видеть на изображении

Map markesr

Цифры нарисованы позже, но, как вы можете увидеть это ISN» t достаточно ясно из-за фона.

Что я сейчас хочу сделать, это заполнить маркер белым, а не быть прозрачным.

Обращаю маркер следующим образом:

GraphicsPath p = new GraphicsPath(); 
p.AddString(MarkerSymbol, markerFont.FontFamily, (int)markerFont.Style, symbolSize.Height * 0.9f, CorrectedSymbolLocation, stringFormat); 
graphics.FillPath(brush, p); 

Я уже пробовал некоторые вещи, как:

Region region = new Region(p); 
graphics.FillRegion(new SolidBrush(Color.White), region); 

Я искал в Интернете, и я нашел страницу, упоминая функцию: graphicsPath.Outline() (поэтому в моем случае p.Outline()), но C# не распознает эту функцию.

Может кто-нибудь сказать мне, возможно ли, чего я хочу попытаться достичь, и если да, то как я могу это достичь?

+2

Свойство Graphics.Clip - это регион. Вы можете создать Region из GraphicsPath. Что позволяет создавать эффекты [вроде этого] (https: // msdn.microsoft.com/en-us/library/windows/desktop/dd183441%28v=vs.85%29.aspx). –

+1

@ Ханс: Это то, что он уже сделал, но не то, что он хочет. Он хочет заполнить внутреннее пространство букв, например, внутри буквы «О», а не штриха. – TaW

+0

Он принимает собственные формы букв. Интерьер, конечно, не должен быть проблемой. –

ответ

0

я, наконец, нашел решение, благодаря BlogPost найдено Here!

Вместо создания растрового изображения, я создаю, а suggeste в блоге, в GraphicsPathIterator.

Вместо того, чтобы создавать путь и заполнять путь (как сказано в вопросе), теперь добавьте GraphicsPathIterator.

GraphicsPath p = new GraphicsPath(); 
p.AddString(MarkerSymbol, markerFont.FontFamily, (int)markerFont.Style, symbolSize.Height * 0.9f, CorrectedSymbolLocation, stringFormat); 

var iter = new GraphicsPathIterator(p); 
while (true) 
{ 
    var subPath = new GraphicsPath(); 
    bool isClosed; 
    if (iter.NextSubpath(subPath, out isClosed) == 0) break; 
    Region region = new Region(subPath); 
    graphics.FillRegion(new SolidBrush(Color.White), region); 
} 
graphics.FillPath(brush, p); 
0

Одним из возможных способов заключается в

1 - создать Bitmap нужного размера

2 - DrawString на него

3 - использовать floodfill, чтобы заполнить интерьер.

Затем используйте DrawImage вместо DrawString.

Вы должны повторить этом для каждого изменения в FontSize или собирать Растровые ..

Я не уверен, насколько хорошо это (или любое другое решение, которое я могу придумать) будет работать с произвольными символами шрифта. Особенно, когда они open нет четкого определения того, что вы хотели бы видеть.

Для каждого персонажа вам понадобится одна или несколько точек, которые сидят в интерьере (ах).

Смежные вопросы