2009-10-24 89 views
3

我正在使用Visual Studio Extensibilty API将插件写入Sql Server Management Studio。我已经成功地在文本表面上叠加了一个控件(我试图模仿CodeRush/Refactor动作列表,类似于intellisense组合),但是我只能根据以下属性找到它的坐标空间:如何将控件覆盖到Visual Studio代码表面

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

此代码的确允许我将cols/rows转换为像素,但是我无法找到一种方式来在文本编辑器垂直或水平滚动时抵消cols/rows。这会导致列表框在可见屏幕空间下消失。

我在寻找的是从当前列/行对获取屏幕坐标的方法,这样我就可以将列表框放在光标旁边,而不管滚动的位置。

+0

我不知道哪些API可用,但你确定这是不可能实现'IVsTextMarker'和'IVsTextMarkerClient'来创建与一段代码相关的菜单(这是重构帮助器的工作方式)? – 2009-10-24 22:09:32

+0

@ 280Z28 - 这些界面看起来很有希望。我想完全跳过DTE,这看起来好像可能有效。可能是因为我正在为SSMS做这件事。谢谢 – 2009-10-24 22:11:41

+0

您是否想过使用DXCore(coderush背后的库)。它免费从Dev Express – 2009-10-24 22:28:00

回答

1

TextSelection类型的TextDocument.Selection属性具有TextPane属性 - 有关更多信息,请参阅here。它没有明确地这样说,但TextPane是可见屏幕的一部分。此外,TextPane的StartPoint属性提供滚动文本的“偏移量”。

因此,我能够从选择的StartPoint可以减去TextPane.StartPoint确定偏移光标位置:

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 
    ); 
} 
相关问题