Главная » C#, Компоненты » Реализация дополнительного меню с помощью маркера

0

Класс Behavior, используемый при определении поведения маркера, никак не ограничивает нас, как именно будет реализовано это поведение. В качестве дополнительного примера я хочу показать код, реализующий дополнительное меню, которое открывается при щелчке на маркере. Нечто подобное реализовано в .NET 3.0 для компонентов Windows Workflow Foundation. Само меню создается в конструкторе класса:

public MenuBehavior(BehaviorService behaviorService, Control control) {

this .behaviorService = behaviorService; this.control = control;

menu = new ContextMenu(};

menu.Menulterns.Add(new MenuItem("Zoom+",

new EventHandler(MenulOnClick))); menu. Menul terns. Add (new Menul tern (" Zoom- ",

new EventHandler(Menu20nClick})};

}

А в обработчике правой кнопки мыши это меню отображается:

public override bool OnMouseUp(Glyph g, MouseButtons button) (

Вид получившегося маркера показан на рис. 6.11, а его работу можно посмотреть, запустив код, находящийся на компакт-диске.

if (button = MouseButtons.Right)

{

menu.Show(control, new Point(control.Width, 0));

}

return true;

}

Полный код маркера показан в листинге 6.18, а результат выполнения кода — на рис. 6.12.

using System;

using System.Collections.Generic; using System.Text;

using System.Windows.Forms.Design.Behavior; using System.Drawing; using System.Windows.Forms;

namespace MyControl t

class MenuGlyph : Glyph t

Control control;

BehaviorService behaviorService; Point center;

public MenuGlyph(BehaviorService behaviorService, Control control) : base(new MenuBehavior(behaviorService, control))

t

this.behaviorService = behaviorService; this.control = control;

}

// Границы метки

public override Rectangle Bounds t

get t

// Используем метод сервиса для получения точки // края компонента

Point edge = behaviorService.ControlToAdornerWindow(control);

// Размер компонента Size size = control.Size; // Вычисляем центр

center — new Point(edge.X + size.Width, edge.Y); // Граница — это прямоугольник 10×10 Rectangle bounds = new Rectangle(center.X – 5,

center.Y – 5, 10, 10) ;

return bounds;

}

}

// Возвращаем нужный курсор, если указатель мыши // попал на нашу границу. Иначе возвращаем null.

public override Cursor GetHitTest(Point p) {

if (Bounds.Contains(p) )

{

return Cursors.Hand;

}

return null;

}

// Рисуем границу

public override void Paint(PaintEventArgs pe)

{

pe.Graphics.FillRectangle(Brushes.Blue, Bounds);

}

// Определяем поведение при попадании курсора на маркер

class MenuBehavior t Behavior

{

BehaviorService behaviorservice; Control control; ContextMenu menu;

public MenuBehavior(BehaviorService behaviorservice, Control control}

{

this.behaviorservice — behaviorservice; this.control = control;

// Создаем меню

menu = new ContextMenu();

menu. Menul terns. Add (new Menu I tem (" Zoom+ ",

new EventHandler(MenulOnClick))); menu.Menultems.Add(new Menultem("Zoom-",

new EventHandler(Menu20nClick)));

}

void MenulOnClick(object sender, EventArgs e)

{

control.Left — 5;

control.Top — 5;

control.Width += 10;

control.Height += 10;

// Обновляем границы

behaviorService.SyncSelection();

1

void Menu20nClick(object sender, EventArgs e) {

// Пересчитываем размер control.Left += 5; control.Top += 5; control.Width -= 10; control.Height -= 10; // Обновляем границы behaviorService.SyncSelection();

1

public override bool OnMouseUp(Glyph g, MouseButtons button) {

if (button = MouseButtons.Right) {

// Отображаем меню

menu.Show(control, new Point(control.Width, 0));

1

// True означает, что мы обработали событие return true;

Рис. 6.12. Отображение дополнительного меню с помощью маркера

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии