Робота з екраном у Delphi, Delphi, компоненти Delphi, вихідні джерела Delphi
Робота з екраном у Delphi
Для першої кнопки напишемо у події onclick вміст лістингу:
За допомогою цієї процедури ми малюємо прямо на екрані, поза області вікна своєї програми. Під час малювання не звертаємо уваги на запущені програми. Якщо вони трапляються, то малювання відбувається поверх них.
Тепер про вміст програмного коду. Спочатку оголошено змінну ScreenDC типу hdc. hdc це тип контексту малювання самої Windows, і працює він майже так само, як і TCanvas (трохи пізніше ви побачите зв'язок). За допомогою функції GetDC(0) ми отримуємо контекст вікна, вказаного як параметр. Але в дужках стоїть 0 (нуль), а не вказівник на реальний пристрій чи вікно. Це означає, що хочемо отримати глобальний контекст, т. е. самого екрана.
Далі викликається функція Rectangle, вона схожа на ту, що ми використовували раніше, коли працювали з полотномTCanvas.Rectangle. Є тільки одна відмінність - перший параметр - тепер контекст пристрою, а потім йдуть координати прямокутника. Це пов'язано з тим, що ми малювали раніше через об'єкт TCanvas, який прив'язаний до певного компонента. А це означає, що об'єкт може самостійно підставляти покажчик на свій об'єкт. Зараз ми малюватимемо засобами GDI Windows. Його функція Rectangle є універсальною і не пов'язана з певними елементами керування або вікнами. Якщо чесно, то процедура TCanvas.Rectangle лише викликає Rectangle з Windows API і підставляє потрібний контекст пристрою та розміри, тому в ній на один параметр менше. Зараз ми робимо це без допомоги TCanvas.
Після малювання звільняється непотрібний контекст малювання через функцію ReleaseDC. Такі речі обов'язково треба робити, щоб не засмічувати пам'ять.
Якщо ви захочете малювати нена екрані, а всередині певного вікна, то в цій процедурі потрібно виправити лише перший рядок. А саме – як параметр GetDC передавати покажчик на вікно.
Зараз можна запустити програму та подивитися на результат. Тепер перейдемо до другої кнопки. Для неї напишемо (для процедури події onclick) вміст лістингу:
Тут ми отримуємо копію екрана та зберігаємо її в компоненті image1.
Перший рядок такий самий, як і в попередній процедурі. Ми так само отримуємо контекст малювання екрану. Потім ініціалізується змінна canvas типу TCanvas (знайомий нам контекст малювання). Потім ми зв'язуємо їх між собою за допомогою простого присвоєння уcanvas.Handle:=screenDC. Тепер TCanvas вказує на екран і можна малювати на ньому звичними методами. Тепер ви бачите зв'язок між полотном canvas та контекстом малювання hdc. Об'єкт полотна завжди містить покажчик на контекст малювання hdc як handle і використовує цей контекст при викликі всіх своїх методів (таких як Rectangle). Для компонентів Delphi ця властивість заповнюється автоматично, і нам не треба дбати про неї.
Виходить, щоTCanvas - це об'єкт, який спрощує в Windows API-функції і перетворює роботу з графікою на об'єктну.
Далі ми отримуємо копію екрану і записуємо її в картинку Timage за допомогою функції CopyRect У контексту малювання картинки (imagel. Canvas. CopyRect).
Після копіювання потрібно звільнити контекст малювання ScreenDC і створене полотно canvas, щоб звільнити виділену пам'ять.