2016-06-09 12 views
0

지난 주에 C++ 코드 범위를 측정하기위한 Visual Studio Extension을 만들기로 결정했습니다. 기본적으로 나는 일상 작업을 위해 나 자신이 필요했다. 제가 생각한 프로젝트는 https://github.com/atlaste/CPPCoverage입니다.텍스트 앞에있는 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.

Q : 누군가 전경 대신 배경에 블록을 렌더링하는 방법을 알려주시겠습니까?

+0

PS : 작업이 주위에 내가 발견로서 당신은에서 불투명도를 설정할 수 있습니다 레이어. 그게 좋은 방법이긴하지만 배경에 레이어를 넣는 것을 선호합니다. – atlaste

답변

1

7 년 전 물어 보았지만 장식품과 그물에 비주얼 스튜디오를 확장하는 것에 대한 정보는 제로 옆에 있습니다. 여기

은 당신이 그것을 할 방법 : (예 : 우측 => 항목 추가 프로젝트를 클릭) 당신은 마법사 VS 사용하여 TextAdornment 클래스의 인스턴스를 만들 때

  1. 당신이 두 개의 파일을받을 : 첫 번째입니다 당신이 고른 이름, 다른 한 가지는 클래스는

    [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