Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Спосіб 2




Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Dim Картинка As New Bitmap("Spacescape.JPG")

Dim Гр As Graphics = PictureBox2.CreateGraphics

Гр. DrawImage (Картинка, 0, 0)

End Sub

Тут картинка не присвоюється властивості Image елемента управління PictureBox2, а малюється на цьому елементі. Метод DrawImage об'єкта Гр малює вміст об'єкта Картинка на елементі, в результаті чого ми бачимо на ньому картинку. Лівий верхній кут картинки має на елементі управління координати 0, 0.

Аналогічно картинки можна малювати і на формі, і на інших елементах управління. Обидва способи на перший погляд дають один і той же результат, але насправді між ними є істотні відмінності, які ви поступово зрозумієте. Саме таке, що впадає в очі різниця - намальована картинка стирається, як тільки елемент управління, на якому вона намальована, виявляється загороджений іншими вікнами або засунуть вами за край екрану. Зображення ж, що є властивістю Image - не стирається.

Поговоримо детальніше про метод DrawImage.

 

Метод DrawImage і його варіанти

Ось програма:

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

Dim Гр As Graphics = Me.CreateGraphics

Dim Фото As New Bitmap("Spacescape.JPG")

Dim Т As New Point(30, 10)

Dim П1 As New Rectangle(550, 10, 150, 130)

Dim П2 As New Rectangle(550, 160, 200, 70)

Dim П3 As New Rectangle(550, 250, 200, 150)

Dim П4 As New Rectangle(800, 170, 400, 300)

Гр.DrawImage(Фото, Т) ' Точка Т задає лівий верхній кут картинки

Гр.DrawImage(Фото, П1) ' Втискаємо картинку в прямокутник П1

Гр.DrawImage(Фото, П2) ' Втискаємо картинку в прямокутник П2

'Вирізаємо з картинки прямокутник П4 и втискаємо його в прямокутник П3:

Гр.DrawImage(Фото, П3, П4, GraphicsUnit.Pixel)

End Sub

Ось результат роботи програми

Параметр GraphicsUnit.Pixel означає, що одиницею вимірювання для прямокутника П4 ми вибрали піксель в об'єкті Фото. Не плутайте пікселі на формі і екрані з пікселями для невидимих об'єктах Bitmap. Не дивно, що прямокутник П4 ставимо з дуже великими величинами параметрів, адже вимірюються вони в цих самих невидимих пікселях.

Метод Save об'єкта Bitmap

Зберігаємо зображення в файл. Метод Save зберігає картинку з об'єкта Bitmap у файл. Це може знадобитися тоді, коли картинка якось змінена. Ось програма, яка завантажує зображення з файлу Spacescape.JPG і зберігає в файлі Spacescape-1.JPG.

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim Фото As New Bitmap("Spacescape.JPG")

Фото. Save ("Spacescape-1.JPG") 'Зберегли картинку в файлі

End Sub

Перетворюємо формат графічного файлу. У методу Save - кілька варіантів. Один з них дозволяє вказувати формат файлу, що зберігається. Тому в VB є можливість перетворити формат графічного файлу. Ось, наприклад, як просто перетворити файл з формату WMF в формат BMP:

Dim Картинка As New Bitmap ("DIME.WMF")

Картінка.Save ("DIME.BMP", System.Drawing.Imaging.ImageFormat.Bmp)

Перший рядок завантажує файл DIME.WMF в об'єкт Зображення класу Bitmap. Другий рядок зберігає цю картинку у файлі DIME.BMP. Однак не розширення BMP, зазначене нами, наказало комп'ютера змінити формат файлу. Це наказав зробити другий параметр методу - властивість Bmp класу ImageFormat, що належить простору імен System.Drawing.Imaging. Крім властивості Bmp у цього класу є ще десяток властивостей, що відповідають різним форматам графічних файлів. Проте не для всіх з них перетворення цим методом можливе або ж можливо так просто.

 

Малюємо в пам'яті

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

Але що означає «малювати в пам'яті»? Поки ми вміємо в пам'яті тільки зберігати зображення в об'єкті Bitmap і там її трішки перетворювати. А як у пам'яті намалювати, наприклад, круг? Давайте подивимося.

VB дозволяє розглядати об'єкт Bitmap як якусь невидиму поверхню, для якої можна створити об'єкт класу Graphics точно так само, як ми створюємо об'єкт класу Graphics для форми або, скажімо, мітки. Як тільки об'єкт класу Graphics для об'єкта Bitmap створений, ви отримуєте можливість користуватися усіма його методами і, значить, малювати на невидимій поверхні невидимими інструментами все, що вашій душі завгодно, і поміщати туди будь-які картинки. Після того, як ви будете задоволені намальованим, ви можете одним оператором помістити його на загальний огляд на екран.

Ось програма:

 

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

Dim Картинка As New Bitmap(600, 400) 'Створюємо пусту поверхню 600 на 400

Dim Гр As Graphics = Graphics. FromImage (Картинка) 'Створюємо над нею об’єкт класу Graphics

'Малюємо на поверхні:

Dim Векторний_малюнок As New Bitmap("DIME.WMF")

Гр.DrawImage(Векторный_рисунок, 10, 10)

Dim П As New RectangleF(300, 250, 160, 40)

Гр.FillRectangle(Brushes.White, П)

Гр.DrawString("Это монета", Me.Font, Brushes.Black, П)

'Переносимо на форму те, що намальовано на поверхні:

Dim Граф As Graphics = Me.CreateGraphics

Граф.DrawImage(Картинка, 0, 0)

End Sub

 

Пояснення. Результат роботи цієї програми – малюнок нижче, містить картинку, фігуру (білий прямокутник) і текст.

 

Всі ці елементи були спочатку намальовані в пам'яті в об'єкту Bitmap, потім одним оператором вміст об'єкта Bitmap було поміщено на форму.

Розглянемо програму детальніше, оператор за оператором.

Dim Картинка As New Bitmap(600, 400) 'Створюємо порожню поверхню 600 на 400

Тут ми стикаємося з ще одним варіантом конструктора об'єкту Bitmap. Об'єкт створюється порожнім, без картинки. Можна представити його, як чисту поверхню розміром 600 на 400, готову до того, щоб на ній що-небудь намалювали.

Dim Гр As Graphics = Graphics.FromImage(Картинка) 'Створюємо над нею об’єкт класу Graphics

Цей рядок створює для об'єкту Картинка об'єкт класу Graphics. Але, як бачите, спосіб створення тут не такий, як, скажімо, для форми. Там ми використовували функцію Creategraphics форми, тут же ми використовуємо функцію Fromimage класу Graphics. Саме класу, а не об'єкту. Відмінність в суті для вас проясниться пізніше.

Об'єкт класу Graphics створений і ви дістаєте можливість користуватися всіма його методами так, як якби ви малювали на формі або елементі управління. Наступні п'ять рядків процедури наносять на невидиму поверхню об'єкту Bitmap по черзі картинку монети, білий прямокутник і текст.

Останні два рядки процедури переносять вміст об'єкту Bitmap на форму. Для цього створюється об'єкт класу Graphics для форми і перенесення звично здійснюється методом DrawImage цього об'єкту.

 

 

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

Ви, напевно, давно вже звернули увагу на такий факт. Якщо форма з намальованими фігурами (не в події 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


 




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


Дата добавления: 2015-05-24; Просмотров: 374; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.031 сек.