Працюємо з робочим столом, Delphi, Програмування, статті

Virtual Reality

У сьогоднішньому розділі графіки я вирішив познайомити тебе із знущанням над десктопом. Якщо говорити точніше, ми сьогодні навчимося на ньому малювати і запам’ятовувати його вміст. Як завжди, я постараюся все хорошенечко розтлумачити і показати. Сподіваюся, що тобі сподобається сьогоднішнє заняття.

Для знущань нам знадобитися форма з двома кнопками і однією картинкою. Створи новий проект і постав на нього дві Пімп TButton і один штука TImage. Приступимо? Для першої кнопки напишемо у події
OnClick :

procedure TForm1.Button1Click(Sender: TObject);
var
ScreenDC:HDC;
begin
ScreenDC := GetDC(0);
Rectangle(ScreenDC, 10, 10, 200, 200);
ReleaseDC(0,ScreenDC);
end;

За допомогою цієї процедури я малюю прямо на десктопі. Під час малювання, мені насрати на все запущені програми. Якщо вони трапляються під руку, то малювання відбувається поверх них.

Тепер про вміст. Я оголошую змінну ScreenDC типу HDC. HDC – це контекст малювання в windows, і працює майже так само, як і TCanvas (трохи пізніше ти увідешь зв’язок). За допомогою функції GetDC (0) я повертаю контекст вікна зазначеного в дужках. Але в цих дужках стоїть 0 (нуль), а це значить, що мені потрібен глобальний контекст, тобто самого десктопа.

Далі, я викликаю функцію Rectangle, вона схожа на ту, що ми використовували раніше TCanvas.Rectangle. Є тільки одна відмінність – перший параметр тепер, це контекст пристрою, а потім йдуть координати прямокутника. Це пов’язано з тим, що раніше ми малювали через об’єкт TCanvas, а зараз будемо малювати засобами GDI Windows. Скажу по секрету 🙂 TCanvas.Rectangle всього лише викликає Rectangle з Windows API та підставляє потрібний контекст пристрою і розміри. Зараз ми самі зробимо це, без допомоги
TCanvas.

Після малювання, я звільняю більше не потрібний мені контекст через функцію ReleaseDC. Такі речі обов’язково треба звільняти, щоб не засмічувати пам’ять.

Якщо ти захочеш малювати не на десктопі, а всередині певного вікна, то в цій процедурі потрібно поправити тільки перший рядок. А саме, в якості параметра GetDC передавати покажчик на вікно. Відразу виникає питання: “Як дізнатися покажчик вікна чужої проги? “. Для цього можна скористатися функцією FindWindow (з нею ми вже знайомилися в попередніх номерах).

Зараз можна запустити прогу і подивитися на результат, а ми я поки перейду до другої Пімп. Для неї ми напишемо наступний текст:

procedure TForm1.Button2Click(Sender: TObject);
var
Canvas:TCanvas;
ScreenDC:HDC;
begin
ScreenDC := GetDC(0);
Canvas:=TCanvas.Create();
Canvas.Handle:=ScreenDC;
Image1.Canvas.Copyrect(Rect(0,0,Image1.Width,Image1.Height),
Canvas, Rect(0,0,Screen.Width,Screen.Height));
ReleaseDC(0,ScreenDC);
Canvas.Free;
end;

Відразу скажу, що тут я отримую копію десктопа.

Перший рядок така ж, як і в попередній процедурою. Я точно також отримую контекст десктопа. Потім я створюю нову змінну Canvas типу ТCanvas (знайомий нам контекст малювання). Потім я пов’язую їх між собою за допомогою простого привласнення у Canvas.Handle: = ScreenDC. Тепер мій TCanvas вказує на декстопов, і я можу малювати на ньому, звичними нам методами.

Далі, я отримую копію екрану і записую її в картинку TImage за допомогою функції Copyrect у контексту малювання картинки (Image1.Canvas.Copyrect). Ця функція виглядає так:

procedure CopyRect(
Dest: TRect; / / Розміри одержуваного зображення
Canvas: TCanvas ;/ / Контекст, з якого буде копіюватися
Source: TRect / / Розміри вихідного зображення
);

CopyRect проводить копіювання зображення і одночасне масштабування з розмірів Source в
Dest.

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

TRect = record
Left, Top, Right, Bottom: Integer;
end;

З цим типом ми ще не знайомі. Якщо гарненько розглянути, то можна помітити подібність із оголошенням об’єктів. Це так. Записи – це маленькі об’єкти, але не мають методів (процедур і функцій), а тільки параметри будь-якого типу. Всі параметри загальнодоступні і всередині записи не можна використовувати директиви private, protected або public.

Для отримання такого типу і використовую функцію Rect яка створює TRect. Як параметри виступають відповідні розміри Rect (0, 0, Image1.Width,
Image1.Height).

Другий параметр – контекст малювання Canvas, який у нас асоційований з контекстом десктопа. З нього і буде відбуватися копіювання.

Третій параметр – розміри початкового зображення.

І в самому кінці, я звільняю контекст малювання десктопа ReleaseDC (0, ScreenDC); і Canvas.Free.

Запусти прогу і подивися на результат. Якщо щось ще залишилося незрозумілим, то після цього всі стане на свої місця.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*