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

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

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

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

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ TBitmap ΠΈΠ½ΠΎΠ³Π΄Π° создаСт DIB-сСкции, Π΄Π°ΠΆΠ΅ Ссли свойства HandleType ΠΈ PixelFormat явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° использованиС DDB. ОсобСнно часто это Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ большого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. По всСй видимости, это происходит, ΠΊΠΎΠ³Π΄Π° Π² систСмном ΠΏΡƒΠ»Π΅ Π½Π΅Ρ‚ мСста для хранСния DDB-изобраТСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ TBitmap Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π»ΡƒΡ‡ΡˆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ DIB-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Π΅ΠΌ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ BitmapSpeed Π½Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π΅ΠΌΠΎΠΌ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС позволяСт ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ выполнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с DDB- ΠΈ DIB-изобраТСниями.

1.1.12. ANSI ΠΈ Unicode

Windows ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ: ANSI ΠΈ Unicode. Π’ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ ANSI (American National Standard Institute) ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ кодируСтся ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. ΠšΠΎΠ΄Ρ‹ ΠΎΡ‚ 0 Π΄ΠΎ 127 ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с ΠΊΠΎΠ΄Π°ΠΌΠΈ ASCII, ΠΊΠΎΠ΄Ρ‹ ΠΎΡ‚ 128 Π΄ΠΎ 255 ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ символы Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ страницы. ΠšΠΎΠ΄ΠΎΠ²Ρ‹Π΅ страницы ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ многочислСнныС символы Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков Π² ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ страницСй, Ρ‚.Π΅. с ΠΎΠ΄Π½ΠΈΠΌ языком. НСвСрно выбранная кодовая страница ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию нСпонятных символов (Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΈΡ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ "кракозябрами") вмСсто осмыслСнного тСкста.

Π’ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Unicode ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 2 Π±Π°ΠΉΡ‚Π° Π½Π° символ, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 65 536 символов. Π­Ρ‚ΠΎΠ³ΠΎ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ для символов Π»Π°Ρ‚ΠΈΠ½ΠΈΡ†Ρ‹ ΠΈ ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹, грСчСского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, китайских ΠΈΠ΅Ρ€ΠΎΠ³Π»ΠΈΡ„ΠΎΠ², арабских ΠΈ СврСйских Π±ΡƒΠΊΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ многочислСнных Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… (финансовых, матСматичСских ΠΈ Ρ‚. ΠΏ.) символов. ΠšΠΎΠ΄ΠΎΠ²Ρ‹Ρ… страниц Π² Unicode Π½Π΅Ρ‚.

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

Кодовая страница русского языка Π² ANSI ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ 1251. ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° символов Π² Π½Π΅ΠΉ отличаСтся ΠΎΡ‚ принятой Π² DOS Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π’ цСлях совмСстимости для DOS-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ для ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Windows ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ. ИмСнно поэтому ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ русского тСкста Π² ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹Ρ… прилоТСниях ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ самыС "кракозябры". Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого, слСдуСт ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы ΠΈΠ· ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ANSI Π² DOS ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅, ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ β€” ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CharToOem ΠΈ OemToChar.

Windows NT/2000/XP ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ANSI ΠΈ Unicode Π² ΠΏΠΎΠ»Π½ΠΎΠΌ объСмС. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ любая функция, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ со строками, прСдставлСна Π² Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ…: для ANSI ΠΈ для Unicode. Windows 9x/ΠœΠ• Π² ΠΏΠΎΠ»Π½ΠΎΠΌ объСмС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ANSI. Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π² этих систСмах Π΅ΡΡ‚ΡŒ Ρƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшого числа Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. КаТдая страница MSDN, посвящСнная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ со строками (ΠΈΠ»ΠΈ со структурами, содСрТащими строки), Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части содСрТит надпись, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π»ΠΈ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для NT/2000/XP ΠΈΠ»ΠΈ для всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ.

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

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° тСкста Π½Π° экран. Unicode-Π²Π΅Ρ€ΡΠΈΡŽ Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π΅ ΠΈΠ· Π½ΠΈΡ… TextOut ΠΈ ExtTextOut. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ DrawText ΠΈ DrawTextEx ΠΈΠΌΠ΅ΡŽΡ‚ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Windows NT/2000/XP. Если ΠΆΠ΅ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠΊΠ½Π°ΠΌΠΈ, Ρ‚ΠΎ срСди Π½ΠΈΡ… Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ, которая ΠΈΠΌΠ΅Π»Π° Π±Ρ‹ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π² Windows 9Ρ…/ΠœΠ•. Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ с ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Microsoft прСдоставляСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для Windows 9x/ΠœΠ• ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Unicode Π² эти систСмы. Π­Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ называСтся MSLU (Microsoft Layer for Unicode), Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта Microsoft.

Рассмотрим, ΠΊΠ°ΠΊ ΡΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterWindowMessage. Богласно справкС, ΠΎΠ½Π° экспортируСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ user32.dll. Однако Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ список Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, экспортируСмых этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ (это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ TDump.exe, входящСй Π² состав Delphi), Ρ‚ΠΎ Ρ‚Π°ΠΌ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Π·Π°Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterWindowMessageA ΠΈ RegisterWindowMessageW. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ· Π½ΠΈΡ… β€” это ANSI-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, вторая β€” Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (Π±ΡƒΠΊΠ²Π° W ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Wide β€” ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ; символы ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Unicode часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌΠΈ ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ символ приходится Π½Π΅ ΠΎΠ΄ΠΈΠ½, Π° Π΄Π²Π° Π±Π°ΠΉΡ‚Π°).

Π‘Π½Π°Ρ‡Π°Π»Π° разбСрСмся с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Microsoft Visual C++. Π’ стандартных Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… учитываСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ макроопрСдСлСния UNICODE. Π•ΡΡ‚ΡŒ Π΄Π²Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° β€” CHAR для ANSI ΠΈ WCHAR для Unicode. Если макрос UNICODE ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Ρ‚ΠΈΠΏ TCHAR соотвСтствуСт Ρ‚ΠΈΠΏΡƒ WCHAR, Ссли Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ β€” Ρ‚ΠΈΠΏΡƒ CHAR (послС этого ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΎΡ‚ TCHAR Ρ‚ΠΈΠΏΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ LPCTSTR автоматичСски Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅, опрСдСляСмой Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ отсутствиСм опрСдСлСния UNICODE). Π’ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСтся макрос RegisterWindowMessage. Π•Π³ΠΎ смысл Ρ‚Π°ΠΊΠΆΠ΅ зависит ΠΎΡ‚ макроса UNICODE: Ссли ΠΎΠ½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, RegisterWindowMessage эквивалСнтСн RegisterWindowMessageW, Ссли Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ β€” RegisterWindowMessageA. ВсС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, вставляя ΠΈΠ»ΠΈ убирая ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ UNICODE, ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ мСняя Π½ΠΈ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ символа Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ ANSI- ΠΈΠ»ΠΈ Unicode-Π²Π΅Ρ€ΡΠΈΡŽ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Delphi Π½Π΅ стали ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Π²ΠΈΠ΄ΠΈΠΌΠΎ, этому помСшала ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π² Delphi Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ компиляция ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ всС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ (Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ Ρ‡Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ исходных ΠΊΠΎΠ΄ΠΎΠ²). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Delphi Π½Π΅Ρ‚ Ρ‚ΠΈΠΏΠ°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ TCHAR.

Рассмотрим, ΠΊΠ°ΠΊ Ρ‚Π° ΠΆΠ΅ функция RegisterWindowMessage импортируСтся ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ Windows (листинг 1.19).

Листинг 1.19. Π˜ΠΌΠΏΠΎΡ€Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ RegisterWindowMessage

interface

...

function RegisterWindowMessage(lpString: PChar): UINT; stdcall;

function RegisterWindowMessageA(lpString: PAnsiChar): UINT;

stdcall; function RegisterWindowMessageW(lpString: PWideChar): UINT; stdcall;

...

implementation

...

function RegisterWindowMessage;

 external user32 name 'RegisterWindowMessageA';

function RegisterWindowMessageA;

 external user32 name 'RegisterWindowMessageA';

function RegisterWindowMessageW;

 external user32 name 'RegisterWindowMessageW';

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ функция RegisterWindowMessageA импортируСтся Π΄Π²Π°ΠΆΠ΄Ρ‹: ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΠΎΠ΄ своим настоящим ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· β€” ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ RegisterWindowMessage. Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ· этих ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π²Ρ‹Π·ΠΎΠ²Π° ANSI-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (напоминаю, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏΡ‹ PChar ΠΈ PAnsiChar эквивалСнтны). Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, потрСбуСтся функция RegisterWindowMessageW.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹, содСрТащиС строковыС Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ ANSI- ΠΈ Unicode-Π²Π°Ρ€ΠΈΠ°Π½Ρ‚. НапримСр, структура WNDCLASS Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ Windows прСдставлСна Ρ‚ΠΈΠΏΠ°ΠΌΠΈ TWndClassA (с синонимами WNDCLASSA ΠΈ tagWNDCLASSA) ΠΈ TWndClassW (с синонимами WNDCLASSW ΠΈ tagWHDCLASSW). Π’ΠΈΠΏ TWndClass (ΠΈ Π΅Π³ΠΎ синонимы WNDCLASS ΠΈ tagWNDCLASS) эквивалСнтСн Ρ‚ΠΈΠΏΡƒ TWndClassA. БоотвСтствСнно, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ RegisterClassA ΠΈ RegisterClassExA ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΈΠΏ TWndClassA, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ RegisterClassW ΠΈ RegisterClassExW β€” Ρ‚ΠΈΠΏ TWndClassW.

1.1.13. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ Π² Windows API

Unicode Π² Delphi встрСчаСтся Ρ€Π΅Π΄ΠΊΠΎ, Ρ‚.ΠΊ. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ эту ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ, Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Windows 9x/ΠœΠ•. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° VCL Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Unicode, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡΡΡŒ ANSI. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ± ANSI. Π‘ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Unicode ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² PChar Π½Π° PWideChar ΠΈ string Π½Π° WideString.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками Π² Delphi Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСн Ρ‚ΠΈΠΏ AnsiString, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ просто string (Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ этими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ рассмотрСны Π² Π³Π»Π°Π²Π΅ 3). ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ‚ΠΈΠΏΠ° string являСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° строку, Ρ…Ρ€Π°Π½ΡΡ‰ΡƒΡŽΡΡ Π² динамичСской памяти. Π­Ρ‚ΠΎΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ строки. По ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ хранится число символов Π² строкС ΠΈ счСтчик ссылок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΉ строки, рСализуя Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ "ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ нСобходимости". Если ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΉ строковой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ строковой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ строка Π½Π΅ копируСтся, Π° просто ΠΎΠ±Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ строку. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ссылок ΠΏΡ€ΠΈ этом увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Когда строка модифицируСтся, провСряСтся счСтчик ссылок: Ссли ΠΎΠ½ Π½Π΅ Ρ€Π°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, Ρ‚ΠΎ строка копируСтся, счСтчик ссылок старой ΠΊΠΎΠΏΠΈΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Ρƒ Π½ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ счСтчик ссылок Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, ΠΈ пСрСмСнная, которая мСняСтся, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ копию. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, строка копируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½Π° ΠΈΠ· ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° Π½Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ эту строку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ измСнСния Π½Π΅ ΠΊΠΎΡΠ½ΡƒΠ»ΠΈΡΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ Π»ΡŽΠ±Ρ‹Ρ… модификациях строки Π² Π΅Π΅ ΠΊΠΎΠ½Π΅Ρ† автоматичСски добавляСтся Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ (ΠΏΡ€ΠΈ подсчСтС Π΄Π»ΠΈΠ½Ρ‹ строки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Length ΠΎΠ½ игнорируСтся). Но Ссли ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ строковой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΡƒΡΡ‚ΡƒΡŽ строку, Ρ‚ΠΎ эта пСрСмСнная станСт Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ (nil), ΠΏΠ°ΠΌΡΡ‚ΡŒ для хранСния ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа #0 Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ строковой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· области видимости (Ρ‚. Π΅., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° являСтся локальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΏΠΎΠ»Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° являСтся) ΠΎΠ½Π° автоматичСски финализируСтся, Ρ‚.Π΅. счСтчик ссылок ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ, Ссли ΠΎΠ½ оказываСтся Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ, ΠΏΠ°ΠΌΡΡ‚ΡŒ, выдСлСнная для строки, освобоТдаСтся. (О Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ устройствС AnsiString см. Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π΄. 3.3.)