Como a sobreposição de um controle sobre a superfície de código Visual Studio
-
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.
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
);
}