Если вам нужно отыскать конкретное окно, то у вас есть несколько вариантов (оптимальных для разных ситуаций).
Для новичков: главное окно интегрированной среды всегда доступно непосредственно из объекта dte:
Dim IDE As Window IDE = DTE.MainWindow
Очевидно, что если вам нужно выполнить определенное действие с окном интегрированной среды, то это самый быстрый вариант.
Свойство DTE.ActiveWindow также предоставляет прямой и быстрый доступ к объекту Window (в данном случае это текущее активное окно):
Dim CurrentWindow As Window CurrentWindow = DTE.ActiveWindow
Окна инструментов в интегрированной среде (окно команд, окно списка ошибок, окно вывода, окна Solution Explorer.и Task List и панель инструментов)— также имеют прямой способ нахождения своих экземпляров объектной модели — для этого используется свойство DTE .ToolWindows. Это свойство возвращает объект ToolWindows, который имеет от* дельное свойство для каждого из окон инструментов.
Этот код на Visual Basic получает ссылку на окно Task List и закрывает его:
Dim taskwin As Window
taskwin = DTE.ToolWindows.TaskList taskwin.Close()
И наконец, четвертый способ доступа к окну интегрированной среды — это через коллекцию DTE. Windows; эта коллекция имеет элемент для каждого окна интегрированной среды. Вы можете получить доступ к окну коллекции либо при помощи целого числа, представляющего собой положение окна в коллекции, либо при помощи объекта или строки, представляющих то окно, которое вы хотите найти.
Следующий код получает дескриптор окна Solution Explorer:
Dim windows As Windows2 = DTE.Windows
Dim window As Window = windows.Item(Constants.vsWindowKindSolutionExplorer)
Взаимодействие с окнами
В табл. 11.6 перечислены свойства и методы, имеющиеся у каждого объекта window.
Помимо использования простейших свойств (таких как свойств Height и width— для запроса или изменения размеров окна, либо метода SetFocus для установки фокуса) необходимо особо отметить еще несколько свойств.
□ Свойство Document дает вам возможность программным путем взаимодействовать с документом, имеющимся в окне (если он есть).
□ Свойства Project и Projectltem служат для связи» между такими частями API, как Window и Project/Solution; так же как и свойство Document, вы можете использовать их для взаимодействия с проектом, который связан с окном (либо с элементом проекта, таким как файл кода на Visual Basic, текстовый файл или файл ресурсов).
□ Если вы имеете дело с окном инструментов, то метод SetTabPicture предоставляет способ настройки иконки для вкладки, которая отображается тогда, когда окно инструмента является частью группы окон с вкладками (например, на вкладке окна панели Toolbox отображается картинка с гаечным ключом и молотком (когда оно является частью группы окон с вкладками)).
□ И (только для окон инструментов) SetSelectionContainer можно использовать для предоставления объектов для отображения в окне Properties. Эта возможность полезна в том случае, если у вас есть нестандартное окно, где вам нужно управлять тем, что отображается в окне Properties, когда окно имеет фокус (все стандартные окна Visual Studio уже делают это для вас).
В листинге 11.2 содержится простой макрос, иллюстрирующий использование объекта Window. В этом примере каждое окно запрашивается для определения его типа, а затем данные о каждом окне выводятся в простом окне сообщения.
Imports EnvDTE Imports EnvDTE8О Imports System.Diagnostics Imports System.Windows.Forms
Public Module MacroExamples
Public Sub InventoryWindows()
1 Получить коллекцию всех открытых окон Dim windows As Windows2 = DTE.Windows
' Сосчитать количество открытых окон
Dim windowCount As Integer = windows.Count $
9 Локальные переменные для цикла и хранения окна и строковых результатов Dim idx As Integer Dim results As String Dim window As Window2
results = windowCount.ToString + " windows open..." + vbCrLf
\
' Итерация по коллекции окон For idx = 1 To windowCount window = windows.Item(idx)
Dim title As String = window.Caption
' Если окно содержит документ, то при помощи Window.Document ' будет возвращен объект Document If Not (window.Document Is Nothing) Then ' Вывести это как окно документа Dim docName As String = window. Document. Name results = results + "Window '" + title + "' is vbCrLf
Else
' Если документа нет, то это окно инструмента ' (окна инструментов документов не содержат) results = results + "Window '" + title + "' is vbCrLf
End If Next
9 Показать результаты MessageBox.Show(results, "Window Documents", MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Sub End Module
Примечание
Если вы хотите встроить собственные элементы управления в окно инструментов, то вам придется написать надстройку И использовать метод Windows.CreateToolWindow. Мы описываем это в главе 13.