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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° DirectX Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 8

Автор ΠœΠΈΡ…Π°ΠΈΠ» ΠšΡ€Π°ΡΠ½ΠΎΠ²

ΠΠ°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… программистов ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΌΡƒΡ‰Π°Ρ‚ΡŒ каТущаяся Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΡΡ‚ΡŒ с Ρ†ΠΈΡ„Ρ€Π°ΠΌΠΈ Π² Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, скаТСм, Ρ‚ΠΈΠΏ TDDSurfaceDesc2 заканчиваСтся Π½Π΅ Π½Π° 7. Одни Ρ‚ΠΈΠΏΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ интСрфСйсы, мСнялись с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ вСрсиСй, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΆΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Ρ€Π΅ΠΆΠ΅, поэтому ΠΈΡ… Ρ†ΠΈΡ„Ρ€Ρ‹ "ΠΎΡ‚ΡΡ‚Π°ΡŽΡ‚" ΠΎΡ‚ Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… интСрфСйсов.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π΄ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‚ΠΎΠΆΠ΅ связан с вСрсиСй DirectX. МногоС ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ примСняСм, присутствуСт ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… вСрсиях, ΠΈ для массы ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсы Π½Π΅ сСдьмой, Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, пятой вСрсии. Π›Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΎΠΌΡƒ соблазну, вСдь Ρ‚ΠΎΠ³Π΄Π° ΠΊΡ€ΡƒΠ³ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сущСствСнно Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ. Π― Π½Π΅ смогу ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ этого, ΠΈ Π²Π°ΠΌ ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ лишь Π² случаС ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ нСобходимости. Π’Π΅Π΄ΡŒ навСрняка со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Ρ€Π°Π·Π½ΠΎΡˆΠ΅Ρ€ΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ бСспорядку Π² Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. Богласно спСцификации БОМ-интСрфСйс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ послС Π΅Π³ΠΎ опрСдСлСния. Новый интСрфСйс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ старыС, Ρ‚Π°ΠΊ ΠΈ Π½ΠΎΠ²Ρ‹Π΅ возмоТности. Но интСрфСйсы со ΡΡ‚Π°Ρ€ΡˆΠΈΠΌΠΈ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ вСрсий Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… интСрфСйсов с мСньшими Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана со Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ структурами. ΠœΡ‹ ΡƒΠΆΠ΅ Π½Π°Ρ‡Π°Π»ΠΈ с Π½ΠΈΠΌΠΈ Π·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ. Доступ ΠΊ этим структурам, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… интСрфСйсов, осущСствляСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ нСпосрСдствСнно, Π° Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· интСрфСйс (ΠΌΡ‹ сами заполняСм поля записи). Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ вСрсиСй ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ±Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΌΠΈ полями, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡ… мСняСтся.


ИмСнно ΠΏΠΎ этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ каТдая функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ структуры.

Π‘ΠΎΠ»Π΅Π΅ старая вСрсия DirectX Π½Π΅ смоТСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ поля Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ Π΅ΠΉ структуры, ΠΎΠ½Π° просто Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚ ΠΎ ΠΏΠΎΡΠ²ΠΈΠ²ΡˆΠΈΡ…ΡΡ Π² Π½Π΅ΠΉ Π½ΠΎΠ²Ρ‹Ρ… полях. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡΠ½ΡΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΡˆΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, вводя Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ структур, Ρ‚Π΅ самыС Π΄Π²ΠΎΠΉΠΊΠΈ Π² ΠΈΠΌΠ΅Π½ΠΈ ΠΈΡ… появились ΠΈΠ·-Π·Π° Π·Π°ΠΏΡ€Π΅Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π°Π·Π½Ρ‹Ρ… интСрфСйсов. Но самым Π»ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для нас Π±ΡƒΠ΄Π΅Ρ‚ использованиС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии DirectX.

ДвигаСмся дальшС. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΡ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΌ для нас Π°Π½Ρ‚ΡƒΡ€Π°ΠΆΠ΅. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…02, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰Π΅ΠΌΡƒΡΡ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ здСсь добавился ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события onPaint Ρ„ΠΎΡ€ΠΌΡ‹:



procedure TfrmDD.FormPaint(Sender: TObject);

var

// Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ дСскриптор, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ устройства Π²Ρ‹Π²ΠΎΠ΄Π° GDI

DC : HDC;

wrkCanvas : TCanvas; // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, рабочая ΠΊΠ°Π½Π²Π° begin

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ дСскриптора, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GDI

if FDDSPrimary.GetDC(DC) = DD_OK then begin

wrkCanvas := TCanvas.Create; // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Π½Π²Ρƒ

wrkCanvas.Handle := DC; // Π—Π°Π΄Π°Π΅ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠ°Π½Π²Ρ‹ = DC

// РисуСм Π½Π° ΠΊΠ°Π½Π²Π΅ ΠΊΡ€ΡƒΠΆΠΎΠΊ

wrkCanvas.Ellipse (Left + 50, Top + 50, Left + 100, Top + 100);

wrkCanvas.Free; // ОсвобоТдСниС памяти, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π²Ρ‹

FDDSPrimary.ReleaseDC (DC); // ОсвобоТдСниС контСкста устройства

end;


end;


ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ, Π½Π΅ ΠΎΠΆΠΈΠ΄Π°ΠΉΡ‚Π΅ ΠΎΡ‚ Π½Π΅Π³ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π²Ρ‹Π΄Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ. Π’ΠΏΠ΅Ρ€Π΅Π΄ΠΈ нас ΠΆΠ΄ΡƒΡ‚ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного Π½Π΅ происходит, Π½Π° повСрхности ΠΎΠΊΠ½Π° рисуСтся ΠΊΡ€ΡƒΠΆΠΎΠΊ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π°ΠΆΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ появляСтся ΠΎΠ½ Π½Π° экранС ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅, Ρ‡Π΅ΠΌ нарисованный ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ способом.

Канва Delphi являСтся ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ систСмных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄Π° GDI, Π΅Π΅ свойство Handle Π² точности соотвСтствуСт Ρ‚ΠΈΠΏΡƒ нос, ссылкС Π½Π° устройство Π²Ρ‹Π²ΠΎΠ΄Π°. Π’ этой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GDI для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ устройства, ΠΎΠΊΠ½Π° ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ° памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСтся Π²Ρ‹Π²ΠΎΠ΄.

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΊΠΎΠ΄Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄ повСрхности Getoc позволяСт Π² Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°. Установив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Handle ΠΊΠ°Π½Π²Ρ‹ Π² Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΌΡ‹ добьСмся Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΊΠ°Π½Π²Π΅ физичСски Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π½Π°ΠΌ устройство. ВсС это Π½Π°ΠΌ Π·Π½Π°ΠΊΠΎΠΌΠΎ ΠΏΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅.

ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Π°Ρ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ являСтся ΠΊΠ°Π½Π²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола, Ρ‚Π°ΠΊ ΠΌΡ‹ сами Π·Π°Π΄Π°Π»ΠΈ Π΅Π΅ свойства. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΠ°Π½Π²Π° связана с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ всСго экрана, ΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΊΡ€ΡƒΠΆΠΎΠΊ, ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола, Π° Π½Π΅ Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ… ΠΎΠΊΠ½Π° прилоТСния. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ освобоТдаСм ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ контСкст Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎ дСйствиС являСтся ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΌ. Если Π΅Π³ΠΎ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ просто Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ доступ ΠΊ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ столу для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. Π‘Ρ‚Ρ€Π°ΡˆΠ½Π°Ρ ситуация!

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

ΠœΡ‹ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΌ вопросам, спСцифичным ΠΈΠΌΠ΅Π½Π½ΠΎ для DirectDraw. Π‘ΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ убираСтся с экрана, Π° Π·Π°Ρ‚Π΅ΠΌ восстанавливаСтся, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² прилоТСниях Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…03, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ отслСТиваСтся ошибка, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ситуации, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ выдаСтся осмыслСнноС сообщСниС (рис. 2.1).





Код ошибки - DDERR_SURFACELOST. Как сообщаСтся Π² Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΠ΅, Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Restore повСрхности.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ повСрхности. ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΌΡ‹ связали с Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ столом, ΠΈ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠΊΠ½ΠΎ "ΡƒΡˆΠ»ΠΎ" с экрана, ΠΎΠ½ΠΎ освободило ΠΏΠ°ΠΌΡΡ‚ΡŒ повСрхности для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΅ΠΌΡƒ Π½Π°Π΄ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ свои ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€Π°Π²Π° Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти. Вакая ΠΆΠ΅ ситуация Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ DirectDraw ΠΌΠΎΠ³ΡƒΡ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΠ΄ ошибки DDERR_WASSTILLDRAWING, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠ΅ обСспСчСниС занято ΠΈ запрос Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ добьСмся успСха ΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΈΠ½ΠΎΠ³ΠΎ сообщСния ΠΎΠ± ошибкС.

ВзглянитС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…04, здСсь Ρ€Π΅ΡˆΠ΅Π½Ρ‹ всС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ измСнилось, - это ΠΊΠΎΠ΄, связанный с пСрСрисовкой ΠΎΠΊΠ½Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ΄ собствСнно воспроизвСдСния Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ Π²Π½ΡƒΡ‚Ρ€ΡŒ Ρ†ΠΈΠΊΠ»Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ Π»ΠΈΠ±ΠΎ Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ воспроизвСдСния, Π»ΠΈΠ±ΠΎ Ссли ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ удаСтся, Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ ошибки ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ DDERR_WASSTILLDRAWING:



while True do begin Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, // Код придСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ

hRet := FDDSPrimary.GetDC(DC); // Π—Π°Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ дСскриптор

if Succeeded (hRet) then begin

wrkCanvas := TCanvas.Create;

wrkCanvas.Handle := DC; wrkCanvas.Ellipse (Left + 50, Top + 50, Left + 100, Top + 100);

wrkCanvas.Free; FDDSPrimary.ReleaseDC (DC); Break;

end;


// ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ потСряна, Π½Π°Π΄ΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ if hRet = DDERR_SURFACELOST then begin

hRet := FDDSPrimary._Restore;

// Если Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ, дальшС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ нСльзя

if hRet <> DD_OK then Break; end;

// Ошибка ΠΎΡ‚Π»ΠΈΡ‡Π½Π° ΠΎΡ‚ DDERR_WASSTILLDRAWING, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΏΠΎΠΏΡ€Π°Π²ΠΈΠΌΠ° if hRet <> DDERR_WASSTILLDRAWING then Break;

end;


Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΡ€ΡƒΠΆΠΎΠΊ Π½Π΅ рисовался Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΎΠΊΠ½Π° прилоТСния, ΠΌΠΎΠΆΠ½ΠΎ просто Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ высоту ΠΎΠΊΠ½Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, появился ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ

события OnCanResize:


procedure TfrmDD.FormCanResize(Sender: TObject; var NewWidth,

NewHeight: Integer; var Resize: Boolean); begin

if NewHeight < 110 // Высота ΠΎΠΊΠ½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ мСньшС 110

then Resize := False

else Resize := True;

end;


Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ это ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ события OnResize ΠΎΠΊΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈ событии OnPaint.

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π΅Ρ… ситуаций, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π½Π΅ удаСтся, Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ класса TAppLicationEvents, Π½Π° события OnActivate ΠΈ onRestore ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вызываСтся Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠΎΠ΄, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ создании ΠΎΠΊΠ½Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ восстановлСнии ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΊΠ½Π° прилоТСния Π·Π°Π½ΠΎΠ²ΠΎ создаСм ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ.

Π₯ΠΎΡ€ΠΎΡˆΠ΅Π½ΡŒΠΊΠΎ ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ: протСстируйтС Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² самых Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ситуациях, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ восстанавливайтС ΠΎΠΊΠ½ΠΎ, Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ самыми Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами, помСняйтС установки экрана ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого прилоТСния. ΠšΡ€ΡƒΠΆΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ всСгда, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π΅Π³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ. ΠŸΡ€ΠΈ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΊΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ вСсти сСбя Π½Π΅ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Application.Minimize Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnDeactivate СдинствСнного ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ВосстанавливаСтся ΠΎΠΊΠ½ΠΎ Ρ‚ΠΎΠΆΠ΅ особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°ΡΠΏΠ°Ρ…ΠΈΠ²Π°ΡΡΡŒ Π½Π° вСсь экран.

Π’Π°ΠΊΠΎΠ΅ использованиС полноэкранной ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности, ΠΊΠ°ΠΊ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° воспроизвСдСниС осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ функциями GDI Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠΊΠ½Π° прилоТСния, Ρ€Π΅Π΄ΠΊΠΎ примСняСтся Π² практичСских Π·Π°Π΄Π°Ρ‡Π°Ρ….



Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΅ΡΡ‚ΡŒ нСбольшоС ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ восстановлСнии ΠΎΠΊΠ½Π° прилоТСния ΠΈ Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Π½Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ клавиш <Alt>+<Tab>) ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ создаСтся Π·Π°Π½ΠΎΠ²ΠΎ, Ρ‚ΠΎ ΠΎΠ½Π° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ потСряна. Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ вСсьма нСэкономно Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ прилоТСния.

Π‘Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³

Π‘Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³ΠΎΠΌ называСтся ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ графичСских ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ видСоустройств, ΠΈ DirectDraw прСдставляСт собой просто ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΈΡ‚Ρ‚ΠΈΠ½Π³Π°.