2011-12-23 10 views
6

特定のキーストロークに表示されるIntelliSenseのようなダイアログを開発しました。 (私のプロジェクトはVSパッケージです、私のダイアログはコマンドとして開きます) 問題は、現在のカーソル位置にというダイアログを表示する方法がわかりません。現在選択されているテキストを扱う簡単な方法があります。Visual Studio 2010の拡張機能でテキストカーソルの絶対位置を取得する方法

TextSelection objSel = (EnvDTE.TextSelection)(dte.ActiveDocument.Selection); 

となりますが、ここで絶対位置を得ることはできません。

私はたくさんの検索をしましたが、何も見つかりませんでした。これは私を助けます。 誰かが私の問題を解決するためのヒントや、より良いコード例を私に与えるかもしれません。私は本当にあなたの助けに感謝します!

答えて

6

私は現在のプロジェクトで全く同じことをやっているので、ここに関連するコードのコピーと貼り付けがあります。次の答えを使用してactiveWpfTextViewオブジェクトを生成します:Find an IVsTextView or IWpfTextView for a given ProjectItem, in VS 2010 RC extension

private IVsWindowFrame GetWindow() 
    { 
     // parent is the Microsoft.VisualStudio.Shell.ToolWindowPane 
     // containing this UserControl given in the constructor. 
     var window = (ToolWindowPane)parent.GetIVsWindowPane(); 
     return (IVsWindowFrame)window.Frame; 
    } 

    private void DoShow() 
    { 
     var window = GetWindow(); 

     var textViewOrigin = (activeWpfTextView as UIElement).PointToScreen(new Point(0, 0)); 

     var caretPos = activeWpfTextView.Caret.Position.BufferPosition; 
     var charBounds = activeWpfTextView 
      .GetTextViewLineContainingBufferPosition(caretPos) 
      .GetCharacterBounds(caretPos); 
     double textBottom = charBounds.Bottom; 
     double textX = charBounds.Right; 

     Guid guid = default(Guid); 
     double newLeft = textViewOrigin.X + textX - activeWpfTextView.ViewportLeft; 
     double newTop = textViewOrigin.Y + textBottom - activeWpfTextView.ViewportTop; 
     window.SetFramePos(VSSETFRAMEPOS.SFP_fMove, ref guid, 
      (int)newLeft, (int)newTop, 
      0, 0); 

     window.Show(); 
     resultsList.Focus(); 
    } 
+0

このコードでは 'parent'とは何ですか? –

+1

'parent 'がどこから来たのかを明確にするコメントをコードに追加しました。 – perelman

関連する問題