Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_8-10.docx
Скачиваний:
5
Добавлен:
10.07.2019
Размер:
1.45 Mб
Скачать

Перемальовування картинок, фігур і тексту

Ви, напевно, давно вже звернули увагу на такий факт. Якщо форма з намальованими фігурами (не в події Paint), картинками або написаним текстом ховається з поля зору, закрита іншими вікнами, то коли ми знов її отримуємо з-під інших вікон, то бачимо, що намальовані картинки, фігури і текст стерлися. Якщо ми частину форми затягнули за край екрану, то стирається все, що було намальоване і написане на цій частині, що сховалася за край екрану. Загалом, стирається все те, що пропадає з поля зору.

Але якщо картинка знаходиться на елементі управління як його властивість Image, то вона не стирається. Стирається лише те, що намальоване.

Подія Paint. У якому випадку ми можемо відмітити, що на формі щось стерте? Напевно, тоді і тільки тоді, коли в полі нашого зору на екрані з'являється ділянка форми (нехай навіть найменша), яка була до цього з тієї або іншої причини прихована (і тому з неї все було стерто).

Завдання VB – створити у нас ілюзію, що нічого не стирається. Для цього шлях один – як тільки така ділянка із стертою інформацією виникає в полі зору, одразу її знову замальовувати «як було», щоб людина не встигала нічого помітити. Проте, сам VB замальовувати нічого не збирається, він надає можливість зробити це програмістові. Для чого в допомогу йому VB надає подію Paint. Ця подія наступає якраз тоді, коли в полі зору на екрані з'являється ділянка форми (нехай найменша), яка була до цього прихована. Якщо ви, наприклад, поволі витягуєте форму із-за краю екрану або поволі збільшуєте її висоту або ширину, то кожну найменшу частку секунди в полі зору з'являються «стерті» ділянки, а значить, наступає подія Paint. Виходить, що в даному випадку подія Paint наступає багато раз в секунду.

Раз є подія, означає є і процедура-обробник цієї події. Все, що повинен зробити програміст, це отримати у вікні коду звичайним способом заготівку цієї процедури і записати в неї оператори малювання всіх фігур і всього тексту на формі, які він хоче зберегти від стирання. За принципом: якщо огорожа в одному місці забруднилася – перефарбовуй всю огорожу.

Створіть проект з кнопкою. Введіть у вікно коду такий текст:

Dim Гр As Graphics = Me.CreateGraphics

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Гр.DrawEllipse(Pens.Black, 20, 20, 80, 100)

End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Гр.DrawRectangle(Pens.Black, 10, 10, 200, 100)

End Sub

Запустіть проект. Ви бачите, що квадрат вже на формі, не дивлячись на те, що ніяких кнопок ви не натискали. Відбулося це тому, що подія Paint вже встигла спрацювати при появі форми на екрані. Клацніть по кнопці Button1. З'явився ще і кружок. Тепер засуньте форму частково за лівий край екрану і знову висуньте. Ви побачите, що частина круга стерта, а квадрат неначе і не стирався (див. малюнок нижче).

Насправді він чудово стерся, але при висуненні форми із-за краю екрану багато раз в секунду наступала подія Paint і він кожного разу малювався знову. Причому малювався настільки швидко, що людське око не встигало цього відмітити.

Отже, ми бачимо, що влада над тим, яким фігурам стиратися, а яким ні, знаходиться повністю в руках програміста. Тому, якщо ви хочете, щоб фігури не стиралися, розташовуйте оператори для їх малювання в обробник події Paint.

Подія Paint є не тільки у форми, але і у елементів управління. Можете перевірити його, наприклад, на мітці.

Ми можемо штучно викликати подію Paint і, отже, перемальовування поверхні форми або елементу управління, застосовуючи їх метод Refresh. Наприклад, так:

Me.Refresh()

Image не стирається. Очевидний такий спосіб боротьби із стиранням. Ми малюємо все, що нам потрібне, в пам'яті на об'єкті Bitmap, а потім присвоюємо отриманий Bitmap властивості Image елемента управління.

Приклад: При натисканні кнопки ми малюємо лінію на об’єкті Bitmap (його розміри дорівнюють розмірам елемента PictureBox), а потім властивості Image надаємо значення – об’єкт Bitmap, який вже містить намальовану нами лінію.

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim t As New Bitmap(PictureBox1.Width, PictureBox1.Height)

Dim d As Graphics = Graphics.FromImage(t)

d.DrawLine(Pens.Red, 0, 0, 50, 50)

PictureBox1.Image = t

End Sub

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]