Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 30

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

Π’Π°Π±Π»ΠΈΡ†Π° 6.3. Π Π΅ΠΆΠΈΠΌΡ‹ смСшивания Ρ„ΠΎΠ½Π°

Если функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Ρ‚ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ установлСнный Ρ€Π΅ΠΆΠΈΠΌ смСшивания Ρ„ΠΎΠ½Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ноль.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ данная функция ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ эффСкт Π½Π° стили Π»ΠΈΠ½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ с использованиСм ΠΊΠ°Ρ€Π°Π½Π΄Π°ΡˆΠ°, созданного посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreatePen. Если ΠΊΠ°Ρ€Π°Π½Π΄Π°Ρˆ создан ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ExtCreatePen, Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ эффСкта Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nBkMode ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ спСцифичны для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° устройства. GDI ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ устройства ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ спСцифичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ тСкста ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SetTextColor для нашСго контСкста устройства.

...

SetTextColor(hCurDC, RGB(0, 0, 255));

Данная функция ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°:

...

Function SetTextColor(hdc: HDC; crColor: COLORREF): COLORREF;

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π·Π°Π΄Π°Π΅Ρ‚ контСкст устройства, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ устанавливаСтся Ρ†Π²Π΅Ρ‚ тСкста. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π·Π°Π΄Π°Π΅Ρ‚ сам Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ. Π’ качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ установлСнный Ρ†Π²Π΅Ρ‚, Π½ΠΎ Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ CLRINVALID.

Π¦Π²Π΅Ρ‚ тСкста ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ рисовании изобраТСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ TextOut ΠΈ ExtTextOut, Π° Ρ‚Π°ΠΊΠΆΠ΅ для прСобразования растрового изобраТСния ΠΏΡ€ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ· Ρ†Π²Π΅Ρ‚Π½ΠΎΠ³ΠΎ Π² ΠΌΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ.

ΠœΡ‹ сдСлали всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ тСкста ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ просто Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ с Ρ†Π΅Π½Ρ‚Ρ€Π° нашСй Ρ„ΠΎΡ€ΠΌΡ‹.

...

TextOut(hCurDC, Width div 2, Height div 2, PAnsiChar(sText), Length(sText));

Но для нас нСдостаточно ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ лишь события OnPaint. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ помСстим Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΈ установим ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» Π΅Π³ΠΎ срабатывания Ρ€Π°Π²Π½Ρ‹ΠΌ 100. А Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ ΡƒΠ³ΠΎΠ» Π΅Π³ΠΎ Π½Π°ΠΊΠ»ΠΎΠ½Π° ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅. ПослС Ρ‡Π΅Π³ΠΎ заставляСм ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnPaint нашСй Ρ„ΠΎΡ€ΠΌΡ‹ посрСдством Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RePaint (листинг 6.3).

...

Листинг 6.3.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° OnTimer

procedure TfmText.TurnTimerTimer(Sender: TObject);

begin

with LogFontData do

begin

lfEscapement := lfEscapement + 60;

lfOrientation := lfEscapement;

end;

RePaint;

end;

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ LogFontData объявлСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

...

LogFontData: LOGFONT;

На основании Π΅Π΅ ΠΌΡ‹ создаСм ΡˆΡ€ΠΈΡ„Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ выводится тСкст. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ измСняСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° Π΅Π΅ поля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Π½Π°ΠΊΠ»ΠΎΠ½ тСкста ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅. ВсС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΡ‹ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹ заполняСм ΠΏΡ€ΠΈ создании Ρ„ΠΎΡ€ΠΌΡ‹. Π’Π°ΠΌ ΠΆΠ΅ ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ (листинг 6.4).

...

Листинг 6.4.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Ρ„ΠΎΡ€ΠΌΡ‹ OnCreate

procedure TfmText.FormCreate(Sender: TObject);

begin

with LogFontData do

begin

lfHeight := 30; // высота ΡˆΡ€ΠΈΡ„Ρ‚Π°

lfWidth := 0; // срСдняя ΡˆΠΈΡ€ΠΈΠ½Π° символа

lfEscapement := 0; // Π½Π°ΠΊΠ»ΠΎΠ½ строки ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ оси oX

lfOrientation := 0; // наклон символа

// ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ оси oX

lfWeight := FW_BOLD; // вСс ΡˆΡ€ΠΈΡ„Ρ‚Π°

lfItalic := 0;

lfUnderline := 0;

lfStrikeOut := 0;

// кодовая страница ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

lfCharSet := DEFAULT_CHARSET;

lfOutPrecision := OUT_DEFAULT_PRECIS; // Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ

// Π²Ρ‹Π²ΠΎΠ΄Π°

lfClipPrecision := CLIP_DEFAULT_PRECIS; // отсСчСниС

// Π²Ρ‹Π²ΠΎΠ΄Π°

lfQuality := PROOF_QUALITY; // качСство Π²Ρ‹Π²ΠΎΠ΄Π°

lfPitchAndFamily := VARIABLE_PITCH or FF_DONTCARE;

// сСмСйство ΡˆΡ€ΠΈΡ„Ρ‚Π°

lfFaceName := \'Arial\ // Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡˆΡ€ΠΈΡ„Ρ‚Π°

end;

TurnTimer.Enabled := True;

end;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° рис. 6.2.

Рис. 6.2. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Β«Π Π°Π±ΠΎΡ‚Π° с тСкстом»

6.8. Π Π°Π±ΠΎΡ‚Π° с растровыми изобраТСниями

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² памяти, ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС ΠΎΠΊΠ½Π° вашСго прилоТСния ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΠΊΠ½Π΅.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎ ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. НапримСр, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ для рисования. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС изобраТСния ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΠΏΡΡ‚ΡŒ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ прСдставлСниС изобраТСния, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ обязано Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ сохранСно.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateCompatibleDC, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ контСкст устройства памяти, совмСстимый с контСкстом устройства экрана Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°. ПослС этого Π²Ρ‹ создаСтС Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ посрСдством Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateCompatibleBitmap, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ Π΅Π³ΠΎ Π² контСкстС устройства памяти ΡƒΠΆΠ΅ извСстным Π²Π°ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ создан совмСстимый контСкст устройства ΠΈ Π²Ρ‹Π±Ρ€Π°Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Ѐункция BitBlt ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· исходного Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ³ΠΎ рисунка ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ°. Однако Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ описатСлями Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹Ρ… рисунков. ВмСсто этого функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π²Π° описатСля контСкстов устройств ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ растровыС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ³ΠΎ рисунка, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Π² исходном контСкстС устройства, Π² Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок, Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ контСкстС устройства. Π’ этом случаС Ρ†Π΅Π»Π΅Π²ΠΎΠΉ контСкст устройства являСтся совмСстимым контСкстом устройства. Когда ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ растровых Π΄Π°Π½Π½Ρ‹Ρ… Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ помСщаСтся Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ BitBlt, ΡƒΠΊΠ°Π·Π°Π² Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² качСствС источника совмСстимый контСкст устройства ΠΈ Π² качСствС ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° контСкст устройства экрана (ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π° ΠΈ Ρ‚. Π΄.).

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ изобраТСния всСго Π Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ события Ρ„ΠΎΡ€ΠΌΡ‹: OnCreate, OnPaint, OnClose, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ΄Π½ΠΎ событиС ΠΊΠ½ΠΎΠΏΠΊΠΈ Onclick.

Рассмотрим исходный ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события OnCreate (листинг 6.5).

...

Листинг 6.5. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnCreate

procedure TfmCaptureImage.FormCreate(Sender: TObject);

begin

//создаСм контСкст устройства экрана

hdcScreen := CreateDC(\'DISPLAY\', nil, nil, nil);

//создаСм совмСстимый контСкст устройства памяти

hdcCompatible := CreateCompatibleDC(hdcScreen);

bmpWidth := GetDeviceCaps(hdcScreen, HORZRES);

bmpHeight := GetDeviceCaps(hdcScreen, VERTRES);

//создаСм совмСстимый Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок для hdcScreen

hbmScreen := CreateCompatibleBitmap(hdcScreen, bmpWidth,

bmpHeight);

if hbmScreen <> 0 then

hOldBitmap := SelectObject(hdcCompatible, hbmScreen)

else

hOldBitmap := 0;

Captured := False;

end;

Π—Π΄Π΅ΡΡŒ происходит созданиС контСкста устройства Π Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола посрСдством Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateDC.

...

hdcScreen:= CreateDC(\'DISPLAY\', nil, nil, nil);

ПослС этого создаСтся совмСстимый контСкст устройства памяти для Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ основанного контСкста. Π—Π°Ρ‚Π΅ΠΌ создаСтся совмСстимый Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок.

...

bmpWidth := GetDeviceCaps(hdcScreen, HORZRES);

bmpHeight := GetDeviceCaps(hdcScreen, VERTRES);

//создаСм совмСстимый Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок для hdcScreen

hbmScreen := CreateCompatibleBitmap(hdcScreen, bmpWidth, bmpHeight);

Если Π½Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ совмСстимый Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок, Ρ‚ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π΅Π³ΠΎ Π² совмСстимом контСкстС устройства памяти. Π•Ρ‰Π΅ ΠΌΡ‹ Π²Π²ΠΎΠ΄ΠΈΠΌ Ρ„Π»Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сохранСно Π»ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ВсС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² полях Ρ„ΠΎΡ€ΠΌΡ‹, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ описании Π΅Π΅ класса.

...

hdcScreen, hdcCompatible: HDC;

hbmScreen, hOldBitmap: HBITMAP;

bmpWidth, bmpHeight: Integer;

Captured: LongBool;

Рассмотрим исходный ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° события OnPaint (листинг 6.6).

...

Листинг 6.6.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnPaint

procedure TfmCaptureImage.FormPaint(Sender: TObject);

var

hCurDC: HDC;

begin

if Captured then

begin

hCurDC := GetDC(Handle);

StretchBlt(hCurDC, 0, 0, Width, Height, hdcCompatible,

0, 0, bmpWidth, bmpHeight, SRCCOPY);

ReleaseDC(Handle, hCurDC);

end;

end;

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ. Если Π΄Π°, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ контСкст устройства нашСго ΠΎΠΊΠ½Π° ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π° Π½Π΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ StretchBlt.

ΠŸΠ΅Ρ€Π΅Π΄ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ занятыС Π½Π°ΠΌΠΈ рСсурсы систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ событиС OnClose, исходный ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅ (листинг 6.7).

...

Листинг 6.7.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события OnClose

procedure TfmCaptureImage.FormClose(Sender: TObject;

var Action: TCloseAction);

begin

//восстанавливаСм Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

if hOldBitmap <> 0 then

SelectObject(hdcCompatible, hOldBitmap);

//удаляСм совмСстимый Ρ‚ΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΉ рисунок

if hbmScreen <> 0 then

DeleteObject(hbmScreen);

//удаляСм совмСстимый контСкст устройства памяти

if hdcCompatible <> 0 then

DeleteDC(hdcCompatible);

//удаляСм контСкст устройства экрана

if hdcScreen <> 0 then

DeleteDC(hdcScreen);

end;

Нам ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ послСдний ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Onclick ΠΊΠ½ΠΎΠΏΠΊΠΈ, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΉ Π½Π° Π½Π°ΡˆΡƒ Ρ„ΠΎΡ€ΠΌΡƒ. Π’ Π½Π΅ΠΌ ΠΌΡ‹ прячСм ΠΎΠΊΠ½ΠΎ, сохраняСм ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ экрана ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ нашС ΠΎΠΊΠ½ΠΎ (листинг 6.8).

...

Листинг 6.8.

Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ изобраТСния

procedure TfmCaptureImage.btnCaptureClick(Sender: TObject);

var

hdcForm: HDC;

begin

//прячСм нашС ΠΎΠΊΠ½ΠΎ

Hide;

//сохраняСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ экрана