2016-06-09 20 views
0

上周,我决定创建一个用于测量C++代码覆盖率的Visual Studio扩展。基本上我自己需要我的日常工作。我想到的是可以找到的项目https://github.com/atlaste/CPPCoverage文本前面的Visual Studio装饰会干扰选择

大部分工作正常。然而,我有一些装饰层的问题:

该项目的特点之一是创建(未)覆盖代码的突出显示。突出自身工作正常,但似乎与Visual Studio的选择代码干扰:

Demonstration of issue

相关的代码这是负责的高亮:

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

问:有人可以告诉我如何在背景而不是前景渲染块?

+0

PS:作为一个变通我注意到你可以设置不透明度图层。虽然这是一个很好的解决办法,但我宁愿将该图层置于后台。 – atlaste

回答

1

7年前问,仍然有关于装饰和扩展Visual Studio在网络上的ZERO信息。

这里是你如何做到这一点:

  1. 当您使用VS向导TextAdornment类实例(例如:右键单击项目=>添加项目),您会收到两个文件:第一个是与您选择的名称,而另一个类是

    [NameYouPicked] TextViewCreationListener.cs

  2. 查找解决方案资源管理器中该文件并打开它。

  3. 转到您的装饰定义。它应该是这样的:
/// <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; 
  • 正如你看到的,命令集合是选择后。我不知道哪一层是最早的一个,但我改变了这样的代码,以防止不必要的冲突:
  • [Order(Before = PredefinedAdornmentLayers.BraceCompletion)] 
    
    +0

    很好找。这是7年来的最佳答案......:-S你是对的,遗憾的是文件太少;该框架非常好,但缺乏文档使其很难使用。 – atlaste

    +0

    @atlaste你可能想把它标记为答案:) – cubrman

    +1

    好吧,一旦我确认这是正确的答案,我当然会。尽管如此,考虑到花了7年的时间,我不明白为什么我现在应该匆忙。 :) – atlaste