Расширенные возможности Visual Studio
Надстройками Visual Studio можно управлять при помощи менеджера Add-in Manager в Visual Studio. Он позволяет вам сделать две вещи: загрузить и выгрузить любую зарегистрированную надстройку и указать, как надстройку можно загружать. Для доступа к Add-in Manager (рис. 13.9) выберите меню Tools | Add-in Manager.
Рис. 13.9. Управление надстройками
Это диалоговое окно будет всегда выводить список всех имеющихся на локальном компьютере надстроек. Установка или снятие флажка рядом с названием надстройки приведет к немедленной загрузке или выгрузке надстройки. Флажок Startup определяет— будет ли данная надстройка загружаться автоматически при запуске Visual Studio. Флажок Command Line выполняет то же самое для случая, когда Visual…
Для программного управления надстройками используйте коллекцию DTE.Addins, которая содержит экземпляр Addin для каждой зарегистрированной надстройки (как загруженной, так и нет).
Вы можете напрямую ссылаться на надстройки (из коллекции DTE.Addins) по их имени следующим образом:
Addin addin = this.DTE.Addins.ItemC'MyFirstAddln");
Вы можете использовать свойства объекта надстройки для того, чтобы определить — загружена ли она, узнать ее имя, а также получить ProglD надстройки.
bool isLoaded = addin.Connected; string паше = addin.Name; string id = addin.ProglD;
Примечание
Мы используем термин "зарегистрированный" для обозначения надстройки, которая была инсталлирована на локальном компьютере и зарегистрирована в Visual Studio. В версиях до Visual Studio 2005 это означало, что…
Для начала процесса разработки вы создаете новое решение и проект типа Visual Studio Add-in с именем ColorSelectorAddln. Мастер Add-in Wizard создаст для вас код внутри класса Connect (точно так же, как это было сделано в начале данной главы). Класс Connect — это то место, где должен находиться весь код для интегрированной среды и код специфичный для объектной модели расширяемости.
Кроме основных инструкций надстройки вам понадобится также создать класс типа User Control, который инкапсулирует пользовательский интерфейс, а также логику обработки для надстройки.
Сначала вы можете заняться размещением пользовательского элемента управления там, где имеются все нужные вам функциональные возможности. После того как у вас появится рабочий элемент управления, вы можете начать подключать его к Visual Studio при помощи класса Connect (созданного мастером Add-in Wizard).
Рис. 13.10. Пользовательский элемент управления PaletteControl
Добавьте пользовательский элемент управления PaletteControl в проект надстройки (при помощи выбора Project | Add User Control). После добавления элемента управления вы должны поместить девять элементов управления на поверхность конструирования пользовательского элемента управления. Во-первых, добавьте поле изображения; оно будет использоваться для показа цветовой палитры, хранимой как простое растровое изображение в файле ресурса (в данном…
Теперь, когда пользовательский интерфейс уже есть, мы можем сконцентрироваться на коде. Сначала вы можете добавить обработчик события для движений мыши по полю изображения палитры. При помощи обработчика события MouseMove вы можете мгновенно обновить ваши метки и второе поле изображения (при движении указателя мыши по изображению палитры):
public PaletteControl()
{
InitializeComponent();
this.pictureBoxPalette.MouseMove +=
new MduseEventHandler(pictureBoxPalette_MouseMove); this.pictureBoxPalette.Cursor = System.Windows.Forms.Cursors.Cross;
}
void pictureBoxPalette_MouseMove(object sender, MouseEventArgs e)
{
// Получить цвет под текущим положением указателя мыши Color color = GetPointColor(е.Х, e.Y);
// Обновить метки RGB и второе поле изображения при помощи полученного цвета DisplayColor(color);
// Сгенерировать наш код на языке Visual Basic или C#…
Класс PaletteControl предоставляет два свойства: Code — это строковое свойство, которое содержит код цветовой структуры, сгенерированный при щелчке по палитре, а GenerateVB — это свойство булева типа, которое указывает, какой код должен генерировать элемент управления — на языке Visual Basic (GenerateVB = true) или на языке C# (GenerateVB = false). Далее приведены объявления полей и свойств для этих двух свойств:
string _code = ,,н; public string Code
{
get { return _code; }
}
bool _generateVB = false; public bool GenerateVB {
get { return _generateVB; }
}
Когда указатель мыши двигается по полю изображения, вам нужно перехватывать компоненты цвета точек, находящихся непосредственно под курсором (GetPointColor), обновлять метки и второе поле изображения (чтобы они отражали этот цвет— DisplayColor), а затем генерировать код для реализации соответствующей цветовой структуры (setCode). Далее даны реализации этих процедур:
III <suinmary>
HI Возвращает структуру Color, представляющую цвет пиксела /// в указанных координатах х и у.
/// </summary>
III <param name="x"></parain>
III <param name=My"></param>
III <returns>Структура Color</returns> private Color GetPointColor(int x, int y)
{
Il Получить растровое изображение из поля изображения палитры Bitmap bmp = (Bitmap)pictureBoxPalette.Image;
// Использовать GetPixel для получения цветовой структуры // для…
Поскольку вам понадобится для элемента управления некий способ сообщения о том, что пользователь выбрал цвет (например, щелкнул по палитре), то вы также определяете событие пользовательского класса управления, которое происходит каждый раз, когда на изображении палитры регистрируется щелчок мыцш:
public event EventHandler ColorSelected; protected virtual void OnColorSelected(EventArgs e)
{
if (ColorSelected != null)
ColorSelected(this, e);
}
private void pictureBoxPalette_Click(object sender, EventArgs e)
{
OnColorSelected(new EventArgs());
}
Совет
Для изоляции и тестирования пользовательского элемента управления вы можете добавить в решение проект типа Windows Forms и встроить элемент управления в форму Windows для его тестирования. Просто перетащите элемент управления на форму и запустите…
Класс Connect уже имеет основной код надстройки; теперь настало время вернуться к нему и добавить код для приведения в действие пользовательского элемента управления. Вы хотите, чтобы надстройка без проблем интегрировалась в среду разработки; для этого вы можете использовать окно инструмента (для отображения уже созданного пользовательского элемента управления).
Припоминая обсуждение объектной модели расширяемости, вы знаете, что коллекция Windows2 имеет метод CreateToolWindow2, который позволяет вам создавать ваши собственные нестандартные окна инструментов.
Примечание
Предыдущие версии Visual Studio требовали от вас создания промежуточного элемента управления (при помощи языка C++), который обеспечивал бы показ элемента управления в окне инструмента. Окно инструмента (в свою очередь) было…
Поскольку вы хотите, чтобы окно инструмента создавалось и отображалось после загрузки надстройки, то вызов метода CreateToolWindow2 надо поместить в метод Connect. OnConnection. Сначала вы настраиваете локальный объект, чтобы он указывал на коллекцию DTE. ToolWindows:
II Коллекция DTE.ToolWindows
Windows2 toolWindows= (Windows2)_applicationObject.Windows;
Затем вам нужен объект, в котором будет храниться ссылка на создаваемое вами окно инструмента:
// Объект для ссылки на создаваемое окно инструмента Window2 toolWindow;
И наконец, вам нужно создать параметры, необходимые для метода CreateToolWindow2:
// Объект указателя места заполнения; в конечном итоге будет ссылаться //на пользовательский элемент управления object paletteObject = null;
// Данный раздел указывает путь и имя класса…