Простейшие графические возможности — КиберПедия 

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Простейшие графические возможности

2017-09-10 1007
Простейшие графические возможности 0.00 из 5.00 0 оценок
Заказать работу

В пространстве имен System.Drawing − определены основные структуры для представления:

· точки (координат) − Point и PointF

· размера − Size и SizeF

· прямоугольных областей − Rectangle и RectangleF.

Буква F в конце названия структуры означает, что, в отличие от обычных структур (без F), поля структуры имеют не целочисленные значения, а значения вещественного типа (float).

 

 

Структура Size

 

Структура Size предназначена для хранения ширины и высоты объекта и имеет, для этого, соответствующие открытые свойства Width и Height, доступные как для записи, так и для чтения. При создании объекта Size, с помощью конструктора по умолчанию:

 

Size sz = new Size();

 

свойства Width и Height устанавливаются в ноль.

Изменить значения свойств в последствии можно, например, следующим образом:

sz.Width = 40;

sz.Height = 60;

Структура содержит два конструктора с аргументами:

public Size(int, int);

public Size(Point);

Конструкторы с аргументами позволяют, в момент создания, инициализировать разные экземпляры структуры по-разному:

Size sz1= new Size(10,20); // sz1.Width = 10, sz1.Height = 20 Size sz2 = new Size(15,50); // sz2.Width = 15, sz2.Height = 50

Структура Point

Структура Point содержит открытые свойства X и Y целого типа, доступные, как для записи, так и для чтения.

Для создания точки “pt” можно использовать конструктор по умолчанию:

 

Point pt = new Point();

Конструктор по умолчанию при создании точки обнуляет значения свойств X и Y.

В дальнейшем координаты точки можно изменить, например, следующим образом:

pt.X =25;

pt.Y=75;

Инициализировать новую точку класса Point, можно используя,

конструкторы с аргументами:

 

public Point(Size);

public Point(int, int);

 

Например:

 

Point pt1 = new Point(10,20); // pt1.X =10, pt1.Y=20

Size sz = new Size(27,45);

Point pt2 = new Point(sz); // pt2.X=27, pt2.Y=45

 

Открытый метод структуры:

 

public void Offset( int dx, int dy ); изменяет текущие координаты точки по формулам:X=X+dx и Y=Y+dy;

Структура Rectangle

 

Структура предназначена для определения координат и размера прямоугольника. Структура содержит открытые свойства, часть из которых доступна только для чтения, а часть, как для чтения, так и для записи.

В структуре определены два конструктора с аргументами:

public Rectangle(

int x, // x-координата левого верхнего угла прямоугольника

int y, // y-координата левого верхнего угла прямоугольника

int width, // ширина прямоугольника

int height // высота прямоугольника

);

 

public Rectangle(

Point location, // координата левого верхнего угла прямоугольника

Size size // размер прямоугольника

);

 

С помощью этих конструкторов можно определять размеры и местоположение прямоугольников при их создании:

 

Point pt = new Point(10,15);

Size sz = new Size (50,70);

Rectangle rct = new Rectangle(pt,sz);

Rectangle rect = new Rectangle(20,20,50,30);

 

Структура Rectangle содержит ряд доступных методов. Рассмотрим некоторые из них.

Метод:

public void Intersect(Rectangle);

 

Возвращает структуру, которая описывает прямоугольник, представляющий пересечение двух прямоугольников. Если не имеется никакого пересечения, все свойства структуры обнуляются.

Например:

 

Rectangle rect,rct;

rect = new Rectangle(20,25,50,55);

rct = new Rectangle(10,10,30,40);

rect.Intersect(rct);

 

выполнение, приведенного фрагмента кода установит значения свойства структуры прямоугольника rect следующим образом:

 

X=20, Y=25, Width=20, Height=25.

 

Метод:

 

public static Rectangle Union(Rectangle a, Rectangle b);

 

Возвращает структуру, описывающий минимальный по размерам прямоугольник, включающий в себя прямоугольники a и b.

Методы public void Offset(Point pos) и public void Offset(int x, int y) смещают координаты левой верхней точки прямоугольника по обеим осям на величину, задаваемую параметрами методов.

 

 

Представление цвета

 

Представление цвета осуществляется с помощью экземпляров структуры System.Drawing.Color.

Для задания цвета используется статический метод класса:

 

public static Color.FromArgb(int red, int green, int blue);

 

Параметры метода red, green и blue задают интенсивность красной, зеленой и синей составляющей цвета. Значение каждой компоненты цвета может изменяться в диапазоне от 0 до 255. Это позволяет отобразить 224 различных цветов.

Для задания цвета можно также использовать один из перегруженных методов FromArgb:

 

public static Color FromArgb(int alpha, Color cr);

public static Color FromArgb(int alpha, int red, int green, int blue);

 

Дополнительный параметр alpha задает степень прозрачности цвета. Чем меньше это число, тем меньше насыщенность цвета и тем более прозрачным является этот цвет. Значение параметра alpha может изменяться в диапазоне от 0 до 255. Значение 0 определяет полностью прозрачный (бесцветный), а значение 255 − полностью насыщенный (непрозрачный) цвет.

Структура Color содержит более 200 статических свойств, доступных только для чтения. Эти свойства задают именованные или, так называемые, Интернет − цвета, которые правильно воспроизводятся всеми WEB браузерами.

Например:

Color clr2 = Color.Beige; // бежевый

Color clr3 = Color.Magenta; // сиреневый

Color clr4 = Color.Orange; // оранжевый

Кисти и перья

 

 

Графические объекты рисуются с помощью перьев и кистей.

Сплошные кисти создаются как экземпляры класса System.Drawing.SolidBrush, например:

Brush br2 = new SolidBrush(Color.Magenta);

Brush br3 = new SolidBrush(Color.FromArgb(200,10,120));

 

Параметр color конструктора public SolidBrush(Color color)

класса SolidBrush задает цвет сплошной кисти.

В классе System.Drawing.Brushes определено большое количество статических свойств, возвращающих кисть Интернет цветов. Создание таких кистей выглядит следующим образом:

 

Brush brr = Brushes.Orange;

 

В классе System.Drawing.Drawing2D.HatchBrush определены штриховые кисти.

Конструкторы класса:

 

public HatchBrush(HatchStyle hatchstyle, Color foreColor, Color backColor);

public HatchBrush(HatchStyle hatchstyle, Color foreColor);

 

Параметры:

 

foreColor − цвет штриха кисти;

backColor − цвет фонового штриха кисти (по умолчанию − черный цвет);

hatchstyle − стиль штриховой кисти.

 

Существует большое количество доступных стилей, наиболее типичными являются:

 

Cross − решетчатая кисть;

DiagonalCross − диагональная решетчатая кисть;

Horizontal − горизонтальная штриховка;

Vertical − вертикальная штриховка.

 

Например, создание кисти с вертикальной штриховкой синего цвета и фоновым штрихом бежевого цвета будет выглядеть следующим образом:

 

Brush br1 = new HatchBrush(HatchStyle.Vertical,Color.Blue,Color.Beige);

 

Перья описываются классом System.Drawing.Pen.

Конструкторы класса:

 

public Pen(Color color);

public Pen(Color color, float width);

public Pen(Brush brush);

public Pen(Brush brush, float width);

 

Параметры:

 

color − цвет пера;

width − толщина пера;

brush −кисть.

 

Примеры создания перьев:

 

Pen pn = new Pen(Color. Magenta);

Pen pn1 = new Pen(Color.Orange,5);

Pen pn2 = new Pen(Brushes.Orange);

Pen pn3 = new Pen(Brushes.Magenta,10);

Pen pn4 = new Pen(Color.FromArgb(125,155, 0));

Pen pn5 = new Pen(Color.FromArgb(25,155,200),10);

 

В классе System.Drawing.Pens содержится множество статических свойств, описывающих перья с интернет цветом и толщиной в один пиксель. Создание таких перьев выглядит следующим образом:

 

Pen pn6 = Pens.Brown;

Pen pn7 = Pens.Magenta;

 

 

Рисование линий и фигур

 

Для вывода текстовой и графической информации в окно приложения необходимо использовать контекст устройства.

Контекст устройства в среде.NET инкапсулирован («завернут») в базовом классе System.Drawing.Graphics. Для создания объекта класса Graphics необходимо использовать метод CreateGraphics(), возвращающий ссылку на объект класса Graphics:

 

Graphics dc = CreateGraphics();

 

Полученный объект dc содержит контекст устройства, позволяющий осуществлять вывод информации в окно приложения.

Класс Graphics содержит множество методов, позволяющих рисовать различные графические фигуры. Рассмотрим некоторые из них.

Рисование контуров прямоугольников осуществляется с помощью методов:

 

public void DrawRectangle(Pen pen, Rectangle rect);

public void DrawRectangle(Pen pen, int x, int y, int width, int height);

public void DrawRectangle(Pen pen, float x, float y, float width, float height);

 

Рисование контуров эллипсов осуществляется с помощью методов:

 

public void DrawEllipse (Pen pen, Rectangle rect);

public void DrawEllipse (Pen pen, int x, int y, int width, int height);

public void DrawEllipse (Pen pen, float x, float y, float width, float height);

 

Рисование закрашенных эллипсов и прямоугольников осуществляется с помощью методов:

 

public void FillEllipse(Brush brush, Rectangle rect);

public void FillEllipse(Brush brush, int x, int y, int width, int height);

public void FillEllipse(Brush brush, float x, float y, float width, float height);

public void FillRectangle(Brush brush, Rectangle rect);

public void FillRectangle(Brush brush, int x, int y, int width, int height);

public void FillRectangle(Brush brush, float x, float y, float width, float height);

 

Параметры методов означают следующее:

pen − перо;

brush − кисть;

rect − прямоугольник;

х − координата х левого верхнего угла прямоугольника;

y − координата у левого верхнего угла прямоугольника;

width − ширина прямоугольника;

height −высота прямоугольника;

 

Рисование линий осуществляется с помощью перегруженных методов:

 

public void DrawLine(Pen pen, Point pt1, Point pt2);

public void DrawLine(Pen pen, PointF pt1, PointF pt2);

public void DrawLine(Pen pen, int x1, int y1, int x2, int y2);

public void DrawLine(Pen pen, float x1, float y1, float x2, float y2);

 

Параметры методов означают следующее:

pen − перо;

pt1 − начальная точка рисования;

pt2 − конечная точка рисования;

х1 и у1 − координаты начальной точки рисования;

х2 и у2 − координаты конечной точки рисования;

 

Примеры использоания функций:

 

dc.DrawRectangle(Pens.OrangeRed,5,10,25,45);

dc.DrawEllipse(Pens.Magenta,100,125,20,15);

dc.FillEllipse(Brushes.BlueViolet,45,50,20,15);

dc.DrawLine(Pens.Green,20,40,60,70);

Рисование текста

 

Для рисования текста используют перегруженный метод DrawString. Рассмотрим два из шести перегруженных методов DrawString:

public void DrawString(string s, Font fnt, Brush br, PointF pt);

public void DrawString(string s, Font fnt, Brush br, RectangleF ltRct);

Параметры:

s –строка символов,

fnt – шрифт текста,

br – кисть,

pt – точка, определяющая координаты вывода текста,

ltRct – прямоугольник, внутри которого выводится текст, если же текст не вмещается в область прямоугольника, то он (текст) обрезается.

Например:

Font fnt = new Font("Arial",10); //Шрифт Arial, размер 10

dc.DrawString("Привет!",fnt, Brushes.Green,10,20);

 

Пример 1. Создадим приложение, которое при щелчке левой кнопкой мыши на окне приложения выводит в месте щелчка прямоугольник с текстом координатами левого верхнего угла прямоугольника, а при щелчке правой кнопкой мыши в месте щелчка выводится закрашенный эллипс.

Для этого создайте проект Windows Application. В окне свойств формы выбрать событие MouseDown, дважды щелкнуть на названии события мышкой. В появившейся заготовке метода-обработчика события вставить код, чтобы тело метода выглядело следующим образом:

 

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

Graphics dc = CreateGraphics();

Font fnt = new Font("Coyrier",10);

if(e.Button.ToString()== "Left")

{

dc.DrawRectangle(Pens.OrangeRed,e.X,e.Y,15,15);

dc.DrawString("X="+e.X.ToString()+" Y="+e.Y.ToString(),fnt,Brushes.Green,e.X,e.Y+20);

}

if(e.Button.ToString()== "Right")

{

dc.DrawEllipse(Pens.Magenta,e.X,e.Y,20,15);

dc.FillEllipse(Brushes.Blue,e.X,e.Y,20,15);

}

}

Скомпилируйте приложение. Проанализируйте полученные результаты.

 

Перерисовка окна приложения

 

Если свернуть окно приложения из предыдущего примера, затем вновь развернуть его, то мы, к сожалению, заметим, что изображение на поверхности окна исчезло. Операционная система не восстанавливает содержимого окна. Восстановлением графики и текста должно заниматься само приложение. Операционная система в необходимых случаях вырабатывает сообщение (событие Paint), которое «говорит», что окно приложения не корректно и его необходимо перерисовать. Перерисовка окна должна происходить по событию Paint. Метод-обработчик этого события имеет заголовок:

 

private void Form_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

 

Для этого метода нет необходимости создавать контекст устройства, он передается методу с помощью параметра e. Для получения контекста устройства необходимо выполнить следующую операцию:

 

Graphics dc = e.Graphics;

 

В теле этой функции необходимо выполнить все действия для перерисовки окна.

Очень часто перерисовка окна должна происходить в определенные моменты времени по инициативе приложения. Это бывает необходимо при выводе на экран анимации.

«Заставить» операционную систему выработать событие Paint можно путем вызова метода Invalidate(), который является членом класса System.Windows.Forms.Form. Существуют несколько перегруженных версий этого метода. Одна из них принимает в качестве параметра прямоугольник, который определяет область окна для перерисовки. Используемая нами версия без параметров перерисовывает все окно.

 

Пример 2.

Создадим приложение, в котором при запуске появляется прямоугольник, ширина которого увеличивается через каждые 150мс на 5 пикселей.

1. Объявим в классе Form1 переменную:

 

private int xWidth;

 

2. Создадим метод-обработчик события Paint, для этого в свойствах формы выберем событие Paint и щелкнем по нему. После редактирования тела метода, метод должен иметь вид:

 

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

Graphics dc = e.Graphics;

dc.DrawRectangle(Pens.RoyalBlue,10,100,xWidth,50);

}

 

3. Перенесем на форму Timer из Toolbox, затем в свойствах таймера установим свойство Enable в true и Interval в 150.

4. Далее двойным щелчком мыши по таймеру создаем метод-обработчик таймера. После редактирования тела метода, метод должен иметь вид:

 

private void timer1_Tick(object sender, System.EventArgs e)

{

xWidth += 5;

Invalidate();

}

Скомпилируйте приложение. Проанализируйте полученные результаты.

Вопросы:

1. Какой метод используется для «смещения» координат точки, прямоугольника?

2. Как определить находится ли точка или прямоугольник внутри другого прямоугольника?

3. С помощью какого метода можно найти пересечение прямоугольников?

4. С помощью какого метода можно найти минимальный по размеру прямоугольник, включающий в себя два прямоугольника?

5. С помощью экземпляров, какой структуры задается цвет?

6. Как создаются сплошные кисти, штриховые кисти?

7. Как создаются сплошные перья, штриховые перья?

8. Что означает Интернет цвет, Интернет кисть, Интернет перо?

9. Что собой представляет интерфейс графических устройств?

10. Что такое контекст устройства? Как он создается?

11. С помощью, каких методов контекста устройств осуществляется рисование линий?

12. С помощью, каких методов контекста устройств осуществляется рисование прямоугольников?

13. С помощью, каких методов контекста устройств осуществляется рисование эллипсов?

14. Как задать тип и размер шрифта текста?

15. Как можно нарисовать текст по заданным координатам, в заданном прямоугольнике?

16. Какая функция, обработчик события Paint, вызывается для перерисовки окна приложения?

17. С помощью вызова, какой функции можно инициализировать ОС для генерации события Paint?

Задание:

 

1. Создайте приложение, в котором по нажатию клавиши мыши в месте щелчка выводилось название нажатой клавиши мыши.

2. Создайте приложение, в котором при щелчке на правую кнопку мыши рисовалась линия, соединяющая координату щелчка с левым верхним углом окна приложения.

3. Создайте приложение, в котором выводился след движения мыши (использовать функцию рисования линии).

4. Создать приложение, в котором вводятся координаты окружности и меняются по нажатию кнопки.

5. Создать приложение, в котором прямоугольник смещается на пять пикселей при каждом щелчке мышью вне прямоугольника в ту сторону, с которой был произведен щелчок.

6. Создать приложение, в котором прямоугольник увеличивается на пять пикселей при каждом щелчке правой кнопкой мыши и уменьшается при каждом щелчке левой кнопкой мыши на поверхности прямоугольника.

7. Создать приложение, в котором появляется маленький прямоугольник, который увеличивается (эффект наезда).

8. Создать приложение, в котором в момент создания формы появляются два прямоугольника равных размеров и координат, затем прямоугольники начинают разъезжаться по разным углам окна (по диагонали).

9. Нарисовать минимальный по размеру прямоугольник, включающий в себя оба прямоугольника по пункту 8.

10. Нарисовать прямоугольник, являющийся пересечением исходных прямоугольников по пункту 8.


 

Лабораторная работа №7

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

Меню, находящееся между заголовком и клиентской областью окна приложения, называется главным меню. Кроме главного меню существует другой вид меню контекстные меню или их еще называют меню быстрого вызова. Пункты в видимой части главного меню называются пунктами верхнего уровня. Выбор любого пунктаверхнего уровня главного меню приводит к появлению в виде прямоугольника подменю или другими словами дочернего меню. Подменю в свою очередь состоит из нескольких пунктов. В общем случае меню верхнего уровня представляет собой массив пунктов меню, а каждый пункт меню – массив пунктов подменю.

Для создания меню используются классы MainMenu, ContextMenu и MenuItem, порожденные от абстрактного класса Menu. В классе Menu объявлен внутренний класс MenuItemCollection, который наследуется классами MainMenu, ContextMenu и MenuItem.

Для создания главного меню можно использовать один из трех конструкторов класса MainMenu:

 

public MainMenu()

public MainMenu (MenuItem[] menuItems)

public MainMenu (IContainer container)

 

После создания объекта MainMenu, необходимо вызвать свойство формы Menu и передать ему имя объекта MainMenu. Свойство Menu формы доступно как для записи, так и для чтения. Это свойство позволяет заменять в процессе работы приложения, одно меню формы другим.

Для создания контекстного меню можно использовать один из двух


конструкторов класса ContextMenu:

 

public ContextMenu ()

public ContextMenu (MenuItem[] menuItems)

 

Обычно контекстное меню связано с, каким либо, элементом управления, то есть при щелчке правой кнопкой мыши на поверхности элемента управления появляется контекстное меню. Для того чтобы связать объект, являющийся контекстным меню, с элементом управления необходимо использовать свойство ContextMenu элемента, унаследованное им от класса Contol. Свойство ContextMenu доступно как для записи, так и для чтения.

Контекстное меню не обязательно связывать с конкретным контрольным элементом. Его можно вызвать в любом обработчике события, используя метод:

public void Show (Control control, Point pos),

где первый параметр – это ссылка на элемент управления, к которому относится контекстное меню, а второй – координата точки, где будет выведено контекстное меню.

Для создания конечных пунктов меню можно использовать один из конструкторов класса MenuItem:

 

public MenuItem (),

public MenuItem (string text),

public MenuItem (string text, EventHandler onClick),

public MenuItem (string text, MenuItem[] items),

public MenuItem (string text, EventHandler onClick, Shortcut shortcut),

где:

text – название пункта меню,

onClick – объект типа EventHandler, который является делегатом. С помощью

onClick вызывается функция обработчик пункта меню.

shortcut – комбинация клавиш для быстрого вызова пункта меню.

Shortcut - это перечисление допустимых клавиатурный сочетаний для меню. Оно содержит около 150 различных сочетаний. Использовать в качестве комбинации клавиш, не определенных в перечислении не допустимо.

В качестве примера создадим приложение, в котором имеется главное меню из двух пунктов и каждый пункт содержит два подпункта. При выборе любого пункта подменю на экран монитора выводится окно сообщения MessageBox текст, которого соответствует названию пункта. Подменю первого пункта меню верхнего уровня может вызываться с помощью быстрых клавиш ALT+1 и ALT+2.

 

Пример 1:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace Menu1

{

public partial class Form1: Form

{

// Объявление ссылок

MainMenu MnMen1; //Главное меню

//Первый пункт меню верхнего уровня

MenuItem pnkt1;

MenuItem pnkt1_1; //Первый пункт подменю

MenuItem pnkt1_2; //Второй пункт подменю

//Второй пункт меню верхнего уровня

MenuItem pnkt2;

MenuItem pnkt2_1; //Первый пункт подменю

MenuItem pnkt2_2; //Второй пункт подменю

 

public Form1() //Конструктор формы

{

InitializeComponent();

 

this.Text = "МЕНЮ";//Заголовок формы

 

// Создаем первый пункт меню верхнего уровня - массив из подпунктов pnkt1_1 = new MenuItem("Подпункт 1_1", new EventHandler(Msg1_1), Shortcut.Alt1);

pnkt1_2 = new MenuItem("Подпункт 1_2", new EventHandler(Msg1_2), Shortcut.Alt2);

pnkt1 = new MenuItem("Пункт 1", new MenuItem[] { pnkt1_1, pnkt1_2 });

 

// Создаем второй пункт меню верхнего уровня - массив из подпунктов

pnkt2_1 = new MenuItem("Подпункт 2_1", new EventHandler(Msg2_1));

pnkt2_2 = new MenuItem("Подпункт 2_2", new EventHandler(Msg2_2));

pnkt2 = new MenuItem("Пункт 2", new MenuItem[] { pnkt2_1, pnkt2_2 });

 

// Создаем главное меню - массив из пунктов верхнего уровня

MnMen1 = new MainMenu(new MenuItem[] { pnkt1, pnkt2 });

 

this.Menu = MnMen1;//Связываем меню с формой

}

 

 

//Ниже представлены обработчики пунктов меню

 

void Msg1_1(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 1_1");

}

void Msg1_2(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 1_2");

}

void Msg2_1(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 2_1");

}

void Msg2_2(object sr, EventArgs e)

{

MessageBox.Show("Подпункт 2_2");

}

}

}

Скомпилируйте и выполните приложение.

Обратите внимание, что сначала создаются пункты подменю, затем из этих пунктов создается пункт меню верхнего уровня, и в последнюю очередь из пунктов меню верхнего уровня “собирается” главное меню.

Если необходимо в подменю отделить визуально одну группу пунктов от другой горизонтальной линией, то необходимо объявить пункт меню следующим образом:

MenuItem pnkt = new MenuItem(“-“);

Прочерк в качестве имени подменю распознается как разделитель.

Класс MenuItem содержит большое количество свойств. Используя эти свойства можно динамически изменять внешний вид меню, управлять доступом к пунктам меню и т.п.

Некоторые из них:

1. Shortcut - позволяет устанавливать новое сочетание клавиш для быстрого доступа к меню,

2. ShowShortcut - установка значения свойства false запрещает вывод, справа от названия пункта меню, сочетания клавиш быстрого доступа к меню, true - разрешает

3. Text - позволяет изменять название пунктов меню

4. Visible – разрешает (true) - запрещает (false) отбражение пунктов меню.

5. Enabled ­– блокирует пункт меню при установке его в значение false и разблокирует при установке в true. Заблокированный пункт меню становится серым.

6. DefaultItem – установка его в true приводит к тому, что данный пункт меню становится пунктом меню по умолчанию, то есть, при двойном щелчке на пунте меню верхнего уровня, это пункт подменю сразу вызывается. Текст заголовка такого подменю выводится полужирным шрифтом.

7. Checked – установка его в true приводит к тому, что слева от названия пункта подменю выводится галочка.

 

В классе Menu объявлен внутренний класс MenuItemCollection, который наследуется классами MainMenu, ContextMenu и MenuItem. В классе MenuItemCollection реализованы методы, позволяющие добавлять дочерние пункты меню к главному или контекстному меню либо другому пункту.


Некоторые методы:

 

Menultem Add(string caption)

Menultem Add(string caption, EventHandler onClick)

Menultem Add(string caption, MenuItem [] items)

int Add(MenuItem item)

int Add(int index, MenuItem item)

void AddRange(MenuItem[] items)

 

Для определения количества пунктов меню в коллекции можно использовать свойство Count класса MenuItemCollection.

Рассмотрим использование метода Add для создания контекстного меню.

В приведенном примере цвет фона формы меняется в соответствии с выбранным пунктом контекстного меню.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

 

namespace CntMn

{

public partial class Form1: Form

{

MenuItem myClr; // пункт меню

ContextMenu ctmn;//Контекстное меню

public Form1()

{

InitializeComponent();

ctmn = new ContextMenu();// создание контекстного меню

//Передаем конструкору делегата функцию обработчик пункта меню

EventHandler ev = new EventHandler(MnClick);

//добавляем в меню пункты

ctmn.MenuItems.Add("Red", ev);

ctmn.MenuItems.Add("Blue", ev);

ctmn.MenuItems.Add("Green", ev);

 

foreach (MenuItem itm in ctmn.MenuItems)

itm.RadioCheck = true;

// Выбираем второй пункт меню

myClr = ctmn.MenuItems[2];

myClr.Checked = true;

//Устанавливаем цвет фона

this.BackColor = Color.FromName(myClr.Text);

//связываем с формой контекстное меню

this.ContextMenu = ctmn;

}

// Это обработчик пункта меню

void MnClick(object sr, EventArgs e)

{

myClr.Checked = false;//снимаем флажок со старого пункта меню

myClr = (MenuItem)sr; //получаем ссылку на текущий пункт меню

myClr.Checked = true;//устанавливаем на нем флажок

this.BackColor = Color.FromName(myClr.Text);

}

}

}

Рассмотрим создание меню с помощью мастеров мастерской разработчика Visual Studio.Net.

Создадим приложение, в котором в меню можно выбрать размер прямоугольника (прямоугольник выводится на экран с запуском приложения) большой или маленький. С помощью контекстного меню можно изменить цвет прямоугольника на красный или синий.

 

1. Для создания меню и контекстного меню необходимо перенести из ToolBox на поверхность формы MainMenu и ContextMenu.

2. Необходимо добавить в пункты «большой» и «маленький». Для этого выделяем mainMenu1 и добавляем данные пункты.

3. В контекстное меню contextMenu1 добавляем пункты «красный» и «синий» аналогичным способом.

4. Теперь создадим переменные, с которыми связаны все изменения прямоугольника:

 

private int width;

private int height;

private Color myColor;

 

5. Инициализируем их в конструкторе Form1():

public Form1()

{

InitializeComponent();

myColor = Color.Red;

width = 10;

height = 10;

}

 

6. В свойствах формы создадим, метод-обработчик события Paint и отредактируем его, чтобы он имел вид:

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

Graphics dc = e.Graphics;

Pen myPen = new Pen(myColor);

dc.DrawRectangle(myPen,50,50,width,height);

}

7. Выделим mainMenu1 и двойным щелчком мыши на пункте “Большой” создадим метод-обработчик выбора данного пункта. Отредактируем тело метода, после чего оно должно иметь вид:

 

private void menuItem2_Click(object sender, System.EventArgs e)

{

width = 100;

height = 100;

Invalidate();

}

 

8. Аналогично для пункта “Маленький”:

 

private void menuItem3_Click(object sender, System.EventArgs e)

{

width = 10;

height = 10;

Invalidate();

 

}

 

9. Для пункта contextMenu1 “Красный”:

 

private void menuItem4_Click(object sender, System.EventArgs e)

{

myColor = Color.Red;

Invalidate();

}

 

10. Для contextMenu1 “Синий”:

 

private void menuItem5_Click(object sender, System.EventArgs e)

{

myColor = Color.Blue;

Invalidate();

}

 

11. Для вывода контекстного меню на экран в свойствах формы создаем метод-обработчик события нажатия клавиши мыши, после редактирования метод должен иметь вид:

 

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

Point myPoint = new Point(e.X,e.Y);

if(e.Button.ToString() == "Right")

contextMenu1.Show(this,myPoint);

}

 

12. Компилируем приложение и анализируем полученные результаты.

 

 

Вопросы:

1. Какое меню называется главным меню?

2. Что такое контекстное меню?

3. Какие пункты меню называются пунктами верхнего уровня?

4. Какой класс используется для создания главного меню приложения?

5. Можно ли менять главное меню в процессе работы приложения?

6. Как связать контекстное меню с элементом управления?

7. Как определить в меню клавишу быстрого доступа?

8. Как можно сделать пункт меню недоступным?

9. Как можно пункт меню сделать невидимым?

10. Как задать функцию обработчик пункта меню?

11. Как вывести флажок рядом с названием пункта меню?

 

Задание:

1. Скомпилируйте и выполните приложение по примеру 1. Создайте приложение по примеру 1 с помощью мастеров. Измените, приложение так, чтобы выбранный пункт подменю после срабатывания становился недоступным и вновь становился доступным после срабатывания второго пункта подменю.

2. Скомпилируйте и выполните приложение по примеру 2. Проанализируйте работу приложения. Создайте приложение с помощью мастеров. Добавьте еще несколько пунктов меню для других цветов.

3. Скомпилируйте и выполните приложение по примеру 3. Проанализируйте работу приложения. Определите для пунктов меню клавиши быстрого доступа. Комбинации клавиш быстрого доступа должна отображаться рядом с названием пункта меню.

4. Скомпилируйте и выполните приложение по примеру 3. Проанализируйте работу приложения. Измените, приложение так, чтобы при выборе пункта контекстного меню название цвета (название пункта меню) менялось на некоторый альтернативный. При повторном нажатии название и действие пункта восстанавливалось.

5. Создайте приложение, в котором при нажатии на один пункт меню, слева направо начинал двигаться шар, а при нажатии на другой пункт меню останавливался.

6. Скомпилируйте и выполните приложение по примеру 3. Проанализируйте работу приложения. Изменить приложение так, чтобы в контекстном меню можно было изменить цвет прямоугольника на зеленый, а в главном меню можно было выбрать средний размер.

7. Скомпилируйте и выполните приложение по примеру 3. Изменить приложение так, чтобы контекстное меню появлялось лишь тогда, когда произведен щелчок правой клавишей мыши в области прямоугольника.

8. Создайте приложение, в котором с помощью меню можно задать направление движения шара, который начинает двигаться при щелчке левой кнопки мыши, а останавливается при щелчке на правой кнопке мыши.

9. Создайте приложение, в котором с помощью меню осуществляется выбор фигуры (эллипс, квадрат, треугольник), а с помощью второго пункта меню выбирается цвет для рисования.

10. Создать приложение, в котором при нажатии на кнопку главное меню приложения, с помощью которого можно нарисовать квадрат и прямоугольник, заменялось на другое главное меню, рисующее окружность и эллипс соответственно.


Лабораторная работа №8

Потоки

Создание потока

Для создания потока необходимо создать объект класса Thread.

Один из конструкторов этого класса имеет следующий вид:

public Thread (ThreadStart start)

 

Объект start типа ThreadStart должен содержать адрес точки входа в функцию, которая будет выполняться в потоке.

Тип ThreadStart объявлен в пространстве имен System.Threading с помощью ключевого слова delegate и имеет следующую сигнатуру:

 

public delegate void ThreadStart();

 

Согласно, сигнатуре объявления делегата, потоковая функция должна возвращать значение типа void и не принимать параметров.

Пусть, например, заголовок потоковой функции - void funcThread(), тогда создание объекта start:

 

ThreadStart start = new ThreadStart(funcThread);

 

Конструктору делегата ThreadStart при создании объекта передается имя функции, которая будет выполняться в потоке.

Объект start после своего создания хранит адрес точки входа в функцию funcThread.

Следующим шагом необходимо создать потоковый объект, передав конструктору класса Thread объект start в качестве параметра:

 

Thread thrd = new Thread(start);

 

После создания потокового объекта необходимо запустить потоковую функцию на выполнение путем вызова метода Start, используя ссылку thrd:

 

thrd.Start();

 

Потоковому объекту с помощью свойства Name можно присвоить некоторое имя:

thrd.Name = “ ThrName”;,

или прочесть:

strig nm = thrd.Name;

Поток считается активным, не зависимо от того находится ли он в состоянии останова или нет, до тех пор, пока не завершится запущенная в нем функция. После завершения потоковой функции поток уничтожается. Такое завершение работы потока считается нормальным. Узнать, находиться ли поток в активном состоянии или нет можно с помощью свойства IsAlive, доступного только для чтения. Свойство возвращает значение true, если поток активен и ложь (false), если нет. Это свойство можно использовать для определения момента окончания работы потока. Приостановить работу потока на определенное время можно с помощью статического метода:

public static void Sleep(int time)

класса Thread, где параметр time задает время в миллисекундах.

Для закрепления материала рассмотрим пример, демонстрирующий изложенный материал.

Пример 1:

using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace ConsoleApplication4

{

class MyThread

{

private int count; //счетчик

//объявление ссылки на потоковый объект

public Thread thrd;

public MyThread(string name)

{

count = 0;

//здесь создается потоковый объект для функции FnThr

thrd = new Thread(new ThreadStart(this.FnThr));

thrd.Name = name; // Устанавливаем имя потока.

thrd.Start(); // Запускаем поток на выполнение.

}

//определение потоковой функции

public void FnThr()

{

Console.WriteLine(thrd.Name + " стартовал.");

do

{

Thread.Sleep(300); //”засыпаем” на 0,3 сек

Console.WriteLine("В потоке " + thrd.Name + ", count - " + count);

count++;

} while (count <= 4);

Console.WriteLine(thrd.Name + " завершен.");

}

}

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Главный поток стартовал.");

// Создаем массив ссылок на потоковые объекты

MyThread[] mt = new MyThread[5];

// Создаем объекты класса MyThread.

for (int j = 0; j < mt.Length; j++)

mt[j] = new MyThread("Потомок #" + j.ToString());

bool live;

do

{

live=false;

Console.Write(".");

Thread.Sleep(100); //”спит” главный поток

for (int j = 0; j < mt.Length; j++)

{

live = live | mt[j].thrd.IsAlive;

}

 

} while (live);

Console.WriteLine("Главный поток завершен.");

 

}

 

}

}

В этом приложении объявлен класс MyThread. Конструктор класса MyThread создает потоковый объект с помощью строки кода:

 

thrd = new Thread(new ThreadStart(this.FnThr));

 

Затем потоковому объекту присваивается имя, которое конструктор принимает в качестве параметра и запускается с помощью метода Start() поток, что приводит к вызову потокового метода FnThr().

В методе FnThr () организован цикл, который "считает" от 0 до 4. До входа в цикл метод выводит на консоль имя стартовавшего потока, а после окончания цикла – имя завершившего свою работу потока. Вызов метода Sleep(), в теле цикла метода FnThr () заставляет поток, из которого он был вызван, приостановить выполнение на период времени, заданный в миллисекундах. В методе Main() при выполнении следующих инструкций создается пять объектов класса Thread:

 

// Создаем массив ссылок на потоковые объекты

MyThread[] mt = new MyThread[5];

// Создаем объекты класса MyThread.

for (int j = 0; j < mt.Length; j++)

mt[j] = new MyThread("Потомок #" + j.ToString());

 

После создания потоков и запуска их на выполнение в конструкторе класса MyThread, в приложении выполняются основной поток, а, именно, метод Main() и пять дочерних потоков.

С помощью цикла:

 

for (int j = 0; j < mt.Length; j++)

{

live = live | mt[j].thrd.IsAlive;

}

 

} while (live);

 

метод Main() дожидается завершения работы потоков.

 

 


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.456 с.