Como a sobreposição de um controle sobre a superfície de código Visual Studio

StackOverflow https://stackoverflow.com/questions/1619219

  •  06-07-2019
  •  | 
  •  

Pergunta

Estou escrevendo um suplemento para o SQL Server Management Studio, usando o estúdio extensibilidade APIs Visuais. Eu tive algum sucesso sobrepondo um controle sobre a superfície do texto (Eu estou tentando emular a lista de ações CodeRush / Refactor, semelhante à combinação intellisense), porém só posso localizá-lo é espaço de coordenadas base a seguinte propriedade:

get
{
    var point = TextDocument.Selection.TopPoint;
    return new Cursor( point.DisplayColumn, point.Line );
}

Este código faz, permita-me, em seguida, converter cols / linhas em pixels, no entanto não consigo encontrar uma maneira de compensar os cols / linhas quando o editor de texto foi deslocado verticalmente ou horizontalmente. Isso faz com que a caixa de listagem a desaparecer abaixo do espaço da tela visível.

O que estou procurando é um método de obter as coordenadas de tela do par de col / linha atual, para que eu possa colocar a caixa de listagem ao lado do cursor, independentemente da posição rolado.

Foi útil?

Solução

A propriedade TextDocument.Selection, do tipo TextSelection, tem uma propriedade TextPane - veja aqui para mais informações. Não diz explicitamente que sim, mas o TextPane é a parte da tela que é visível. Além disso, a propriedade StartPoint para uma TextPane fornece o 'offset' do texto rolado.

Por conseguinte, foi capaz de determinar a posição do cursor compensado pela subtração do TextPane.StartPoint de StartPoint da Seleção:

get
{
    var start = TextDocument.Selection.TextPane.StartPoint;
    var top = TextDocument.Selection.TopPoint;
    return new Cursor( 
        top.DisplayColumn - start.DisplayColumn + 1 , 
        top.Line - start.Line + 1 
    );
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top