2016-06-09 24 views
0

Letzte Woche entschied ich mich, eine Visual Studio-Erweiterung für die Messung von C++ Code-Abdeckung zu erstellen. Im Grunde brauchte ich es selbst für meine tägliche Arbeit. Was ich entwickelte, war das Projekt, das gefunden werden kann https://github.com/atlaste/CPPCoverage.Visual Studio Schmuck vor Text stört die Auswahl

Am meisten funktioniert es gut. Allerdings habe ich einige Probleme mit Schmuckschichten:

Eine der Funktionen des Projekts ist es, Hervorhebung des (un) abgedeckten Codes zu erstellen. Hervorhebungen selbst funktioniert gut, aber es scheint, mit dem Auswahlcode von Visual Studio zu stören:

Demonstration of issue

Der entsprechende Code, der für die Hervorhebung verantwortlich ist: mit der

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); 
     } 
    } 
} 

Der komplette Stück Code rechten Kontext finden Sie hier: https://github.com/atlaste/CPPCoverage/blob/master/CoverageExt/CodeRendering/CodeCoverage.cs.

F: Kann mir bitte jemand sagen, wie man die Blöcke auf dem Hintergrund statt im Vordergrund rendert?

+0

PS: Als Behelfslösung Ich habe bemerkt, können Sie einstellen, Undurchsichtigkeit bei die Schicht. Während das eine nette Abwechslung ist, würde ich es vorziehen, die Ebene in den Hintergrund zu stellen. – atlaste

Antwort

1

Vor 7 Jahren gefragt und immer noch gibt es neben ZERO Infos über Verzierungen und die Erweiterung von Visual Studio im Netz.

Hier ist, wie Sie es tun:

  1. Wenn Sie eine TextAdornment Klasseninstanz VS-Assistenten erstellen (zum Beispiel: direkt am Projekt klicken => Element hinzufügen) erhalten Sie zwei Dateien: die erste ist die Klasse mit dem Namen, den Sie ausgewählt, und das andere ist

    [NameYouPicked] TextViewCreationListener.cs

  2. die Datei in Lösung Explorer finden und öffnen.

  3. Gehen Sie zu Ihrer Schmuckdefinition. Es sollte wie folgt aussehen:
/// <summary> 
/// Defines the adornment layer for the adornment. This layer is ordered 
/// after the selection layer in the Z-order 
/// </summary> 
[Export(typeof(AdornmentLayerDefinition))] 
[Name("TextAdornment")] 
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)] 
private AdornmentLayerDefinition editorAdornmentLayer; 
  1. Wie Sie sehen können, ist die Reihenfolge Satz nach Auswahl ist. Ich weiß nicht, welche Schicht ist die früheste, aber ich ändern Sie den Code auf diese Weise unerwünschte Kollisionen zu vermeiden:
[Order(Before = PredefinedAdornmentLayers.BraceCompletion)] 
+0

Schöner Fund. Das ist die beste Antwort in 7 Jahren ...: -S Und du hast Recht, es ist eine Schande, dass es so wenig Dokumentation gibt; das Framework ist wirklich sehr nett, aber das Fehlen von Dokumentation macht es schwierig zu verwenden. – atlaste

+0

@atlaste möchten Sie es als Antwort dann markieren :) – cubrman

+1

Nun, sobald ich bestätige, dass dies die richtige Antwort ist, werde ich natürlich. Wenn man bedenkt, dass es 7 Jahre gedauert hat, sehe ich nicht, warum ich jetzt in Eile sein sollte. :) – atlaste