Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

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

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

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

TabPage:

Text:

Объекты и градиент

Cursor:

Cross

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

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

Теперь, последовательно, для вкладки tabPage3 (нужно переключиться на неё в конструкторе и выделить область самой вкладки) инициализируем три события: 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) и запускаем. Переходим на третью вкладку и инвертируем цвета у всего, до чего дотягивается мышка...