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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 19

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

Π’Π΅Π·Π΄Π΅, Π³Π΄Π΅ трСбуСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° TColor, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ TColorRef, Ρ‚.Π΅. всСм свойствам ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² класса TCanvas, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ Ρ‚ΠΈΠΏ TColor ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ значСния TColorRef, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сформированы функциями API. ΠžΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ: API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΡƒΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с 255-ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ TColor. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· TColor Π² TColorRef осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ColorToRGB. ЗначСния Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ, ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ clNone ΠΈ clDefault ΠΎΠ½Π° оставляСт Π±Π΅Π· измСнСния, Π° значСния 255-Π³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetSysColor. Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° TColor Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GDI.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ кистСй, ΠΏΠ΅Ρ€ΡŒΠ΅Π² ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² Π² GDI ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ отличаСтся ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это дСлаСтся Π² VCL. Класс TCanvas ΠΈΠΌΠ΅Π΅Ρ‚ свойства Pen, Brush, ΠΈ Font, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ свойств ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π±ΠΎΡ€Ρƒ Ρ‚ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π°, кисти, ΡˆΡ€ΠΈΡ„Ρ‚Π°. Π’ GDI эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ, ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ свой дСскриптор, "Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ" Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ контСкст устройства с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SelectObject ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒΡΡ послС использования. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ контСкстС. Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ нСсколько стандартных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π½ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ, Π½ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ. Π˜Ρ… дСскрипторы ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetStockObject. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€ΠΈΡΡƒΡŽΡ‰Π΅ΠΉ Π½Π° контСкстС с дСскриптором DC Π΄Π²Π΅ Π»ΠΈΠ½ΠΈΠΈ: синюю ΠΈ ΠΊΡ€Π°ΡΠ½ΡƒΡŽ (листинг 1.18). Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ функция SelectObject Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ дСскриптор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, родствСнного Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌΠΎΠΌΡƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Ρ€Π°Π½Π΅Π΅. Π’Π°ΠΊ, ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π° ΠΎΠ½Π° Π²Π΅Ρ€Π½Π΅Ρ‚ дСскриптор Ρ‚ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Π΄ΠΎ этого.

Листинг 1.18. РисованиС Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€ΡŒΡΠΌΠΈ с использованиСм GDI

SelectObject(DC, CreatePen(PS_SOLID, 1, RGB(255, 0, 0)));

MoveToEx(DC, 100, 100, nil);

LineTo(DC, 200, 200);

DeleteObject(SelectObject(DC, CreatePen(PS_SOLID, 1, RGB(0, 0, 255))));

MoveToEx(DC, 200, 100, nil);

LineTo(DC, 100, 200);

DeleteObject(SelectObject(DC, SetStockObject(BLACK_PEN)));

ДСскрипторы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² GDI ΠΈΠΌΠ΅ΡŽΡ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ‚ΠΎΠ³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ… создал, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами нСльзя. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ утвСрТдСния, Ρ‡Ρ‚ΠΎ такая ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ этой ошибки Π² Ρ‚ΠΎΠΌ. Ρ‡Ρ‚ΠΎ дСскрипторы ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² GDI ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами Π² старых, 16-разрядных вСрсиях Windows, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ всС утвСрТдСния ΠΎ возмоТности Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ просто ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… свСдСниях.

Для хранСния растровых ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Windows ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°: DDB, DIB ΠΈ DIB-сСкция. DDB β€” это Device Dependent Format, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, опрСдСляСмый графичСским устройством, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄. DIB β€” это Device Independent Bitmap, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Π΅Π΄ΠΈΠ½Ρ‹ΠΉ для всСх устройств. Π€ΠΎΡ€ΠΌΠ°Ρ‚ DIB β€” это ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ графичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GDI для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ способом: Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ измСняя Ρ†Π²Π΅Ρ‚Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… пиксСлов. Π’ 32-разрядных вСрсиях появился Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ β€” DIB-сСкция. По сути Π΄Π΅Π»Π° это Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый DIB, Π½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΉ возмоТностями Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GDI-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ВсС различия ΠΌΠ΅ΠΆΠ΄Ρƒ этими трСмя Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ [1]; ΠΌΡ‹ ΠΆΠ΅ здСсь ограничимся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ ΠΈΡ… ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ DDB поддСрТиваСтся самой Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ΠΎΠΉ (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ устройством Π²Ρ‹Π²ΠΎΠ΄Π°), поэтому ΠΏΡ€ΠΈ опСрациях с Ρ‚Π°ΠΊΠΈΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ задСйствуСтся Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. DDB-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ хранится Π² Π²Ρ‹Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠΌ систСмном ΠΏΡƒΠ»Π΅ памяти (Windows NT/2000/XP) ΠΈΠ»ΠΈ Π² ΠΊΡƒΡ‡Π΅ GDI (Windows 9x/ME). ΠŸΡ€ΠΈ этом Ρ€Π°Π·ΠΌΠ΅Ρ€ DDB-растра Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ 16 ΠœΠ±Π°ΠΉΡ‚ Π² Windows 9x/ME ΠΈ 48 ΠœΠ±Π°ΠΉΡ‚ Π² Windows NT/2000/XP. Π€ΠΎΡ€ΠΌΠ°Ρ‚ DDB Π½Π΅ пСрСносим с ΠΎΠ΄Π½ΠΎΠ³ΠΎ устройства Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ устройства. ΠŸΡ€ΡΠΌΠΎΠΉ доступ ΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ ΠΈ Π΅Π³ΠΎ модификация Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, Ρ‚.ΠΊ. Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ хранСния изобраТСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ устройством нСпрСдсказуСм. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ DDB ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GDI. ЦвСтовая Π³Π»ΡƒΠ±ΠΈΠ½Π° DDB-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ опрСдСляСтся устройством.

DIB-сСкция ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² любой области памяти, Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ограничиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ доступной ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ памяти, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GDI для рисования Π½Π° Ρ‚Π°ΠΊΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ чисто ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ задСйствуя Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒ. DIB-сСкция ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΡƒΡŽ Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ ΠΈ прямой доступ ΠΊ области памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. DIB-сСкция пСрСносима с ΠΎΠ΄Π½ΠΎΠ³ΠΎ устройства Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅. BMP-Ρ„Π°ΠΉΠ»Ρ‹ хранят ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ DIB.

Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ DIB-сСкции зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ процСссора, памяти ΠΈ качСства Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ графичСских Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² систСмой (Π° ΠΎΠ½ΠΈ, Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Windows ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ). Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ DDB зависит Π΅Ρ‰Π΅ ΠΈ ΠΎΡ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ ускоритСля Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚Ρ‹. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒ ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ рисованиС графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² (Π² послСднСм случаС эти ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ рисуСт систСма: Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetDeviceCaps). Π”ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±Ρ‹Π»Π° Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎΠΉ ситуация, ΠΊΠΎΠ³Π΄Π° рисованиС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° DDB-растрС ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠ³ΠΎ растра Π½Π° экран Π±Ρ‹Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ (ΠΈΠ½ΠΎΠ³Π΄Π° β€” Π² Π΄Π²Π°-Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π°) быстрСС, Ρ‡Π΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с DIB-сСкциСй. Однако сСйчас Ρ€Π°Π·Π½ΠΈΡ†Π° стала сущСствСнно мСньшС, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы Π² Ρ†Π΅Π»ΠΎΠΌ выросла сильнСС, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹Ρ… Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ускоритСлСй (Π²ΠΈΠ΄ΠΈΠΌΠΎ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ большС Π½Π΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΡƒΡŽ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ ΡƒΠ·ΠΊΠΈΠΌ мСстом ΠΈ поэтому сосрСдоточили свои усилия Π½Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ускоритСлСй 3D-Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ). На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΡ‰Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с ситуациСй, ΠΊΠΎΠ³Π΄Π° DDB-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ отстаСт ΠΏΠΎ скорости ΠΎΡ‚ DIB.

Класс TBitmap ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ Π² Π²ΠΈΠ΄Π΅ DDB, Ρ‚Π°ΠΊ ΠΈ Π² Π²ΠΈΠ΄Π΅ DIB- сСкции β€” это опрСдСляСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ свойства PixelFormat. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ pfDevice ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ использованиС DDB, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ значСния β€” DIB-сСкции с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ TBitmap создаСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ pfDevice, Π½ΠΎ программист ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚. ΠŸΡ€ΠΈ этом создаСтся Π½ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°, староС копируСтся Π² Π½Π΅Π³ΠΎ ΠΈ уничтоТаСтся.

Π‘ΠΎ свойством PixelFormat тСсно связано свойство HandleType, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния bmDIB ΠΈ bmDDB. ИзмСнСниС свойства PixelFormat ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ измСнСнию свойства HandleType, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Если Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащССся Π² TBitmap, Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ установкой свойств PixelFormat ΠΈΠ»ΠΈ HandleType ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΎΡΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ DIB. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° вывСсти DDB-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСпрСдсказуСмым Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ (Ρ‡Π°Ρ‰Π΅ всСго просто Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ выводится) ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€Π° Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, совмСстимый с Π²ΠΈΠ΄Π΅ΠΎΠΊΠ°Ρ€Ρ‚ΠΎΠΉ.

ΠŸΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ изобраТСния ΠΈΠ· Ρ„Π°ΠΉΠ»Π°, рСсурса ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° класс TBitmap ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ создаСт ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ DIB-сСкции, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ источнику ΠΏΠΎ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½Π΅. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ сТатыС Ρ„Π°ΠΉΠ»Ρ‹ (Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ BMP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сТатиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для 16- ΠΈ 256-Ρ†Π²Π΅Ρ‚Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ) β€” Π² этом случаС создаСтся DDB. Π’ Ρ„Π°ΠΉΠ»Π΅ Graphics ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° глобальная пСрСмСнная DDBsOnly, которая ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½Π° False. Если ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° True, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ DDB.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π’ справкС сказано, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° DDBsOnly = False, вновь создаваСмыС изобраТСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ хранятся Π² Π²ΠΈΠ΄Π΅ DIB-сСкций. На самом Π΄Π΅Π»Π΅ ΠΈΠ·-Π·Π° ошибки Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Graphics (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄ΠΎ 2007-ΠΉ вСрсии Delphi Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) вновь созданноС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ всСгда хранится ΠΊΠ°ΠΊ DDB нСзависимо ΠΎΡ‚ значСния DDBsOnly.

Класс TBitmap ΠΈΠΌΠ΅Π΅Ρ‚ свойство ScanLine, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прямой доступ ΠΊ массиву пиксСлов, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π’ справкС написано, Ρ‡Ρ‚ΠΎ это свойство ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с DIB-изобраТСниями. Но Π½Π° самом Π΄Π΅Π»Π΅ DDB-изобраТСния Ρ‚ΠΎΠΆΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это свойство, хотя ΠΈ с сущСствСнными ограничСниями. Если ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ хранится Π² DDB- Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ScanLine создастся Π΅Π³ΠΎ DIB-копия, ΠΈ ScanLine Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив этой ΠΊΠΎΠΏΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ScanLine Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с DDB-изобраТСниями ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π° с Π΅Π³ΠΎ ΠΊΠΎΠΏΠΈΠ΅ΠΉ, ΠΎΡ‚ΠΊΡƒΠ΄Π° Π²Ρ‹Ρ‚Π΅ΠΊΠ°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ограничСния:

1. ΠšΠΎΠΏΠΈΡ создаётся Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ обращСния ΠΊ ScanLine, поэтому измСнСния, сдСланныС Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ GDI-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ послС этого, Π±ΡƒΠ΄ΡƒΡ‚ нСдоступными.

2. ΠšΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ScanLine создаСт Π½ΠΎΠ²ΡƒΡŽ копию изобраТСния, Π° старая ΠΏΡ€ΠΈ этом уничтоТаСтся. Π“Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ новая копия Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ области памяти, Π½Π΅Ρ‚, поэтому ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ ScanLine, большС нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

3. Π˜Π·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, сдСланныС Π² массивС пиксСлов, Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ копию изобраТСния, Π½ΠΎ само ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ этом Π½Π΅ мСняСтся. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² случаС DDB свойство ScanLine Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.