Модификация приложения Windows Forms : вкладка «Объекты и градиент»



 

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

 

TabPage:

Text: Объекты и градиент
Cursor: Hand

 

Рис. 5. 1. Редактор коллекции TabPage: меняем Text и Cursor

 

На второй вкладке разместим сначала элемент Panel ( , группа «Контейнеры» панели элементов), а затем три кнопки. Свойства всего этого дела (имена элементов не трогаем):

 

Panel:

(Name): panel1
BackColor: Black
AutoScroll: True

Button:

(Name): button1
Text: Прямоугольник

Button:

(Name): Button2
Text: Треугольник

Button:

(Name): Button3
Text: Круг

 

Расстановка элементов выглядит примерно так:

 

Рис. 5. 2. Модифицированная форма приложения и расстановка необходимых элементов управления на второй вкладке

 

Кнопки находятся внутри элемента Panel (поверх).

 

Открываем код нашей формы LWP 19 Main (файл LWP 19 Main . cs). Ищем:

 

   public LWP19Main()

   {

       InitializeComponent();

 

Добавляем после:

 

       DoubleBuffered = true;

 

Ищем:

 

public partial class LWP19Main : Form

{

 

 

Добавляем после:

 

   // Начало: вкладка "Объекты и градиент"

   // Для работы с появлением/скрытием фигур

   bool bDrawFigure1 = false;

   bool bDrawFigure2 = false;

   bool bDrawFigure3 = false;

   // Создаём цвета

     Color c1 = Color.FromArgb(51, 204, 51);

   Color c2 = Color.FromName("Green");

   Color c3 = Color.FromArgb(0, 0, 0);

   Color c4 = Color.FromArgb(51, 104, 51);

   // Конец: вкладка "Объекты и градиент"

 

Инициализируем событие Paint для элемента Panel второй вкладки:

 

   private void panel1_Paint(object sender, PaintEventArgs e)

   {

       Graphics g = panel1.CreateGraphics();

       // Задаём визуализацию со сглаживанием для объекта Graphics

       g.SmoothingMode = SmoothingMode.HighQuality;

       // Массив точек треугольника

       Point[] triangle = { new Point(80, 150), new Point(200, 50), new Point(320, 150) };

       // Задаём перья с цветами c1 и c2 и толщиной в 1 пиксель

       Pen pen1 = new Pen(c1, 1);

       Pen pen2 = new Pen(c2, 1);

       // Заливка и цвета градиента

       Brush brush1 = new LinearGradientBrush(triangle[0], triangle[2], c1, c4);

       Brush brush2 = new LinearGradientBrush(triangle[0], triangle[2], c3, c2);

 

       if (bDrawFigure1)

       {

           // Заливаем цветом прямоугольник

           g.FillRectangle(brush2, new Rectangle(100, 150, 200, 100));

       }

 

       if (bDrawFigure2)

       {

            // Заливаем цветом треугольник

           g.FillPolygon(brush2, triangle);

       }

 

       if (bDrawFigure3)

       {

           // Заливаем цветом эллипс

           g.FillEllipse(brush1, new Rectangle(175, 175, 50, 50));

       }

   }

 

И последовательно инициализируем двойным нажатием события каждой кнопки. Событие Click для каждой из кнопок будет таким:

 

   private void button1_Click(object sender, EventArgs e)

   {

       if (bDrawFigure1 == true) { bDrawFigure1 = false; }

       else bDrawFigure1 = true;

       panel1.Invalidate();

   }

 

   private void button2_Click(object sender, EventArgs e)

   {

       if (bDrawFigure2 == true) { bDrawFigure2 = false; }

       else bDrawFigure2 = true;

       panel1.Invalidate();

   }

 

   private void button3_Click(object sender, EventArgs e)

   {

       if (bDrawFigure3 == true) { bDrawFigure3 = false; }

       else bDrawFigure3 = true;

       panel1.Invalidate();

   } 

 

Компилируем (Debug) и запускаем. Переходим на закладку «Объекты и градиент» и нажимаем на кнопочки... Любуемся, как появляется «домик» с круглым окном...

 

6. Модификация приложения Windows Forms : вкладка «Мой монитор сломался!»

 

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

 

Создаём новую вкладку tabPage 3. Для создания вкладки выделяем мышкой TabControl и на панели свойств в области команд жмём «Добавить вкладку». Свойства новой вкладки:

 

TabPage:

Text: Объекты и градиент
Cursor: Cross

 

Накидаем на вкладку различных элементов, каких не важно. В нашем случае на вкладку было помещено две кнопки, два TextBox и один Label. Изменим свойства элементов управления как угодно? Изменим цвет фона элемента, параметры шрифты и прочее.

 

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

 

Теперь, последовательно, для вкладки tabPage 3 (нужно переключиться на неё в конструкторе и выделить область самой вкладки) инициализируем три события: MouseDown, MouseMove и MouseUp:

 

Код дополнительной переменной, всех событий и двух дополнительных методов будет таким:

 

   Rectangle frameRect; // Вкладка "Мой монитор сломался?!"

 

   private void tabPage3_MouseDown(object sender, MouseEventArgs e)

   {

 

       if (e.Button == MouseButtons.Left)

       {

           // Фиксируем стартовую точку

           frameRect.Location = new Point(e.X, e.Y);

           frameRect.Size = new Size(0, 0);

       }

       base.OnMouseDown(e); // Вызываем базовый метод

   }

 

   private void tabPage3_MouseMove(object sender, MouseEventArgs e)

   {

 

       if (e.Button == MouseButtons.Left)

       {

           DrawFrame(); // Стираем старый прямоугольник

           frameRect.Width = e.X - frameRect.Left;

           frameRect.Height = e.Y - frameRect.Top;

           DrawFrame(); // Рисуем новый прямоугольник

       }

       base.OnMouseMove(e); // Вызываем базовый метод

   }

 

   private void tabPage3_MouseUp(object sender, MouseEventArgs e)

   {

 

       if (e.Button == MouseButtons.Left)

       {

           DrawFrame(); // Стираем старый прямоугольник

           frameRect.Size = new Size(0, 0);

       }

       base.OnMouseUp(e); // Вызываем базовый метод

   }

 

   protected void DrawFrame()

   {

 

       if (!frameRect.Size.IsEmpty)

       {

           Rectangle r = RectangleToScreen(frameRect);

           // Собственно, инвертируем цвета

           ControlPaint.FillReversibleRectangle(r, Color.FromArgb(40, 0, 0, 160));

       }

   }

 

   protected override void OnLoad(EventArgs e)

   {

       SetStyle(ControlStyles.UserPaint, true);

       SetStyle(ControlStyles.AllPaintingInWmPaint, true);

       SetStyle(ControlStyles.DoubleBuffer, true);

       base.OnLoad(e);

   }

 

Обратим внимание на метод OnLoad: здесь идёт включение режима двойной буферизации. Для его включения необходимо в окне, в которое производится отрисовка (например, элементе управления или форме) установить флаги UserPaint, AllPaintingInWmPaint и DoubleBuffer перечисления System.Windows.Forms.ControlStyles.

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

 

Компилируем (Debug) и запускаем. Переходим на третью вкладку и инвертируем цвета у всего, до чего дотягивается мышка...

 


Дата добавления: 2019-09-13; просмотров: 259; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!