Text 如何使用WindowsAPICodePack在文本上实现大纲效果?
在我们的其他需求完成之后,我仍然在这个问题上苦苦挣扎。我发现我们可以使用类似GeometrySink的类来实现大纲效果;但我不熟悉C++;见本文: 使用ID2D1GeometrySink可以创建更复杂的形状 接口,用于指定由直线、曲线、, 和弧。ID2D1GeometrySink被传递给 ID2D1PathGeometry以生成复杂的几何图形。 ID2D1SimplifiedGeometrySink也可以与DirectWrite API一起使用 提取格式化文本的路径轮廓以进行艺术渲染 如果你有任何建议或想法,请让我知道 致以最良好的祝愿, 霍华德我用。这里是一小段代码(这是正在进行的工作,我刚刚得到它的渲染,但它可能是您正在寻找的东西)Text 如何使用WindowsAPICodePack在文本上实现大纲效果?,text,outline,direct2d,windows-api-code-pack,Text,Outline,Direct2d,Windows Api Code Pack,在我们的其他需求完成之后,我仍然在这个问题上苦苦挣扎。我发现我们可以使用类似GeometrySink的类来实现大纲效果;但我不熟悉C++;见本文: 使用ID2D1GeometrySink可以创建更复杂的形状 接口,用于指定由直线、曲线、, 和弧。ID2D1GeometrySink被传递给 ID2D1PathGeometry以生成复杂的几何图形。 ID2D1SimplifiedGeometrySink也可以与DirectWrite API一起使用 提取格式化文本的路径轮廓以进行艺术渲染 如果你有
我把它变成了一个通用的XAML大纲文本渲染器。谢谢你的发帖 干杯, 保罗
public class OutlineTextRender : SharpDX.DirectWrite.TextRenderer
{
readonly Factory _factory;
readonly RenderTarget _surface;
readonly Brush _brush;
public OutlineTextRender(RenderTarget surface, Brush brush)
{
_factory = surface.Factory;
_surface = surface;
_brush = brush;
}
public Result DrawGlyphRun(object clientDrawingContext, float baselineOriginX, float baselineOriginY, MeasuringMode measuringMode, SharpDX.DirectWrite.GlyphRun glyphRun, SharpDX.DirectWrite.GlyphRunDescription glyphRunDescription, ComObject clientDrawingEffect)
{
using (PathGeometry path = new PathGeometry(_factory))
{
using (GeometrySink sink = path.Open())
{
glyphRun.FontFace.GetGlyphRunOutline(glyphRun.FontSize, glyphRun.Indices, glyphRun.Advances, glyphRun.Offsets, glyphRun.IsSideways, (glyphRun.BidiLevel % 2) > 0, sink);
sink.Close();
}
Matrix matrix = Matrix.Identity;
matrix = matrix * Matrix.Translation(baselineOriginX, baselineOriginY, 0);
TransformedGeometry transformedGeometry = new TransformedGeometry(_factory, path, matrix);
_surface.DrawGeometry(transformedGeometry, _brush);
}
return new Result();
}
public Result DrawInlineObject(object clientDrawingContext, float originX, float originY, SharpDX.DirectWrite.InlineObject inlineObject, bool isSideways, bool isRightToLeft, ComObject clientDrawingEffect)
{
return new Result();
}
public Result DrawStrikethrough(object clientDrawingContext, float baselineOriginX, float baselineOriginY, ref SharpDX.DirectWrite.Strikethrough strikethrough, ComObject clientDrawingEffect)
{
return new Result();
}
public Result DrawUnderline(object clientDrawingContext, float baselineOriginX, float baselineOriginY, ref SharpDX.DirectWrite.Underline underline, ComObject clientDrawingEffect)
{
return new Result();
}
public SharpDX.DirectWrite.Matrix GetCurrentTransform(object clientDrawingContext)
{
return new SharpDX.DirectWrite.Matrix();
}
public float GetPixelsPerDip(object clientDrawingContext)
{
return 0;
}
public bool IsPixelSnappingDisabled(object clientDrawingContext)
{
return true; ;
}
public IDisposable Shadow
{
get
{
return null;
}
set
{
// throw new NotImplementedException();
}
}
public void Dispose()
{
}
}
public void strokeText(string text, float x, float y, float maxWidth)
{
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd756692(v=vs.85).aspx
// FIXME make field
SharpDX.DirectWrite.Factory factory = new SharpDX.DirectWrite.Factory(SharpDX.DirectWrite.FactoryType.Shared);
TextFormat format = new TextFormat(factory, "Verdana", 50);
SharpDX.DirectWrite.TextLayout layout = new SharpDX.DirectWrite.TextLayout(factory, text, format, 50, 1000);
using (var brush = new SolidColorBrush(_surface, CurrentColor))
{
var render = new OutlineTextRender(_surface, brush);
layout.Draw(render, x, y);
//_surface.DrawTextLayout(new DrawingPointF(x, y), layout, brush);
// _surface.DrawGlyphRun(new DrawingPointF(x, y), run, brush, MeasuringMode.Natural);
}
}