2

先週、C++ コード カバレッジを測定するための Visual Studio 拡張機能を作成することにしました。基本的に、毎日の仕事のために自分で必要でした。私が思いついたのは、https://github.com/atlaste/CPPCoverageにあるプロジェクトです。

ほとんどの場合、正常に動作します。ただし、装飾レイヤーにはいくつかの問題があります。

このプロジェクトの機能の 1 つは、(カバーされていない) コードの強調表示を作成することです。強調表示自体は正常に機能しますが、Visual Studio の選択コードに干渉しているようです。

問題のデモンストレーション

強調表示を担当する関連コード:

private void HighlightCoverage(CoverageState[] coverdata, ITextViewLine line)
{
    IWpfTextViewLineCollection textViewLines = view.TextViewLines;

    int lineno = 1 + view.TextSnapshot.GetLineNumberFromPosition(line.Extent.Start);

    CoverageState covered = lineno < coverdata.Length ?
                            coverdata[lineno] : CoverageState.Irrelevant;

    if (covered != CoverageState.Irrelevant)
    {
        SnapshotSpan span = new SnapshotSpan(view.TextSnapshot, 
                                    Span.FromBounds(line.Start, line.End));
        Geometry g = textViewLines.GetMarkerGeometry(span);
        if (g != null)
        {
            GeometryDrawing drawing = (covered == CoverageState.Covered) ?
                new GeometryDrawing(coveredBrush, coveredPen, g) :
                new GeometryDrawing(uncoveredBrush, uncoveredPen, g);

            drawing.Freeze();

            DrawingImage drawingImage = new DrawingImage(drawing);
            drawingImage.Freeze();

            Image image = new Image();
            image.Source = drawingImage;

            //Align the image with the top of the bounds of the text geometry
            Canvas.SetLeft(image, g.Bounds.Left);
            Canvas.SetTop(image, g.Bounds.Top);

            layer.AddAdornment(AdornmentPositioningBehavior.TextRelative, 
                               span, null, image, null);
        }
    }
}

適切なコンテキストを持つ完全なコードは、https ://github.com/atlaste/CPPCoverage/blob/master/CoverageExt/CodeRendering/CodeCoverage.cs にあります。

Q: ブロックを前景ではなく背景にレンダリングする方法を教えてください。

4

1 に答える 1