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

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

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

function TfrmDD.InitSurfaces(Window : THandle) : HRESULT;

var

hRet : HRESULT;

ddsd : TDDSURFACEDESC2;

ddscaps : TDDSCAPS2;

p : TPoint;

begin

if flgWindowed then begin // ΠžΠΊΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ доступ

hRet := FDD.SetCooperativeLevel(Window, DDSCL_NORMAL);

if Failed(hRet) then begin Result := hRet;

ErrorOut(hRet, 'SetCooperativeLevel');

Exit;

end;


// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ области Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ экрана

Windows.GetClientRect(Window, rcViewport);

Windows.GetClientRect(Window, rcScreen);

// Находим ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ клиСнтской области ΠΎΠΊΠ½Π° Π½Π° экранС

Ρ€.Π₯ := rcScreen.Left;

p.Y := rcScreen.Top;

Windows.ClientToScreen(Window, p);

OffsetRect(rcScreen, p.X, p.Y);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS;

ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;

end;


hRet := FDD.CreateSurface(ddsd, FDDSPrimary, nil);

if Failed(hRet) then ErrorOut(hRet, 'CreateSurface FAILED');

// Для ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ прилоТСния создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния

hRet := FDD.CreateClipper(0, FDDClipper, nil);

if Failed(hRet) then ErrorOut(hRet, 'CreateClipper FAILED');

// АссоциируСм отсСчСниС с ΠΎΠΊΠ½ΠΎΠΌ прилоТСния

FDDClipper.SetHWnd(0, Window);

FDDSPrimary.SetClipper(FDDClipper) ;

FDDClipper := nil;

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π½Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°, нСпосрСдствСнного Π²Ρ‹Π²ΠΎΠ΄Π° with ddsd do begin

dwFlags := DDSD_WIDTH or DDSD_HEIGHT or DDSD_CAPS;

dwWidth := 640;

dwHeight := 480;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

end;


hRet := FDD.CreateSurface(ddsd, FDDSBack, nil);

if Failed(hRet) then ErrorOut(hRet, 'CreateSurface2 FAILED');

end

else begin // ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

// Π—Π°Π΄Π°Π΅ΠΌ Ρ€Π΅ΠΆΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ доступа

hRet := FDD.SetCooperativeLevel(Window, DDSCL_EXCLUSIVE or

DDSCL_FULLSCREEN);

if Failed(hRet) then ErrorOut(hRet, 'SetCooperativeLevel FAILED')

// Π’ΠΈΠ΄Π΅ΠΎΡ€Π΅ΠΆΠΈΠΌ 640x480x8

hRet := FDD.SetDisplayMode(640, 480, 8, 0, 0) ;

if Failed(hRet) then ErrorOut(hRet, 'SetDisplayMode FAILED');

// Π Π°Π·ΠΌΠ΅Ρ€ области Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π³Ρ€Π°Π½ΠΈΡ† ΠΎΠΊΠ½Π°, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ значСния

SetRect(rcViewport, О, О, 640, 480);

CopyMemory (OrcScreen, @rcViewport, SizeOf(TRECT));

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ Π·Π°Π΄Π½ΠΈΠΌ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;

ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or

DDSCAPS_COMPLEX;

dwBackBufferCount := 1;

end;


hRet := FDD.CreateSurface(ddsd, FDDSPrimary, nil);

if Failed(hRet) then ErrorOut(hRet, 'CreateSurface FAILED');

ZeroMemory(@ddscaps, SizeOf(ddscaps));

ddscaps.dwCaps := DDSCAPS_BACKBUFFER;

hRet : = FDDSPrimary.GetAttachedSurface(ddscaps, FDDSBack);

if Failed(hRet) then ErrorOut(hRet, 'GetAttachedSurface FAILED');

end;


Result := DD_OK;

end;


Как я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», ΠΊΠΎΠ΄, связанный с созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², вызываСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ°:


procedure TfrmDD.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if (Key = VK_RETURN) and (ssAlt in Shift) then begin // ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

FActive := False; // На врСмя ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ пСрСрисовку

flgWindowed := not flgWindowed; // МСняСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π°

FormCreate(nil); // УдаляСм ΠΈ Π·Π°Π½ΠΎΠ²ΠΎ восстанавливаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ end else

if (Key = VK_ESCAPE) or (Key = VK_F12) then Close;

end;


ΠŸΡ€ΠΈ пСрСрисовкС ΠΎΠΊΠ½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΊΡ€ΡƒΠ³, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ тСкст подсказки:


function TfrmDD.UpdateFrame : BOOL;

var

ddbltfx : TDDBLTFX; // Для очистки Ρ„ΠΎΠ½Π°

DC : HOC; // Бсылка Π½Π° контСкст, Π½ΡƒΠΆΠ½Π° для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ GDI

hOldBrush : HBrush; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Ρ„ΠΎΠ½Π° hOldPen : HPen; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°Ρ€Π°Π½Π΄Π°ΡˆΠ°

begin

// ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΎΠΊΠ½Π°

ZeroMemory(@ddbltfx, SizeOf(ddbltfx));

ddbltfx.dwSize := SizeOf(ddbltfx);

ddbltfx.dwFillColor := 0;

FDDSBack.Bit(nil, nil, nil, DDBLT^COLORFILL or DDBLT_WAIT, @ddbltfx);

// ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ контСкста

if FDDSBack.GetDC(DC) = DD_OK then begin

// Π’Ρ‹Π²ΠΎΠ΄ Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π°

SetBkColor(DC, RGB(0, 0, 255)); // Π‘ΠΈΠ½ΠΈΠΉ Ρ„ΠΎΠ½ для тСкста

SetTextColor(DC, RGB(255, 255, 0)); // Π–Π΅Π»Ρ‚Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ Π±ΡƒΠΊΠ²

// ΠšΡ€ΡƒΠ³ Π·Π°ΠΊΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ сСрым

hOldBrush := SelectObject(DC, GetStockObject(LTGRAY BRUSH));

// Π‘Π°ΠΌ ΠΊΡ€ΡƒΠ³ - Π±Π΅Π»Ρ‹ΠΉ

hOldPen := SelectObject(DC, GetStockObject(WHITE_PEN));

Ellipse(DC, xl, yl, x2, y2); // РисуСм ΠΊΡ€ΡƒΠ³

SelectObject(DC, hOldPen); o // ВосстанавливаСм ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅

SelectObject(DC, hOldBrush); // ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ рисования

// ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΡ€ΡƒΠ³Π° Π½Π° экранС, ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ экрана

xl := xl + xDir;

Ρ…2 := Ρ…2 + xDir;

if xl < 0 then begin

xl := 0;

x2 := 40;

xDir := -xDir; // ΠœΠ΅Π½ΡΠ΅Ρ‚ΡΡ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния, ΠΊΡ€ΡƒΠ³ отскакиваСт end; if x2 >= 640 then begin

xl := 640 - 1 - 40;

x2 := 640 - 1;

xDir := -xDir;

end;


yl := yl + yDir; y2 := y2 + yDir; if yl < 0 then begin

yl := 0;

y2 := 40;

yDir := -yDir; end; if y2 >= 480 then begin

yl := 480 - 1 - 40;

y2 := 480 - 1;

yDir := -yDir;

end;


// Π’Ρ‹Π²ΠΎΠ΄ подсказки

TextOut(DC, 0, 0, 'Press Escape to quit', 20);

if flgWindowed

then TextOut(DC, 0, 20,

'Press Alt-Enter to switch to Full-Screen mode', 45)

else TextOut(DC, 0, 20,

'Press Alt-Enter to switch to Windowed mode', 42);

FDDSBack.ReleaseDC(DC);

Result := True;

end

else Result := False; // ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ потСряна

end;


Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ состояния оТидания сообщСний ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Ρ‹:


if FActive then begin

if UpdateFrame then while TRUE do begin

// ΠžΠΊΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ

if flgWindowed

then hRet := FDDSPrimary.Blt(@rcScreen, FDDSBack,

@rcViewport, DDBLT_WAIT, nil)

else

// ΠŸΠΎΠ»Π½ΠΎΡΠΊΡ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Flip

hRet := FDDSPrimary.Flip(nil, 0) ;

if hRet = DD_OK then Break; if hRet = DDERR_SURFACELOST then begin

hRet := FDDSPrimary._Restore;

if Failed(hRet) then Break;

end;


if hRet ΠΎ DDERR_WASSTILLDRAWING then Break;

end

else

// ВоспроизвСдСниС Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, восстанавливаСм ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ

FDDSPrimary._Restore; // Для простоты Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΠ΅

end;


Напоминаю, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ запускаСтся Π² полноэкранном Ρ€Π΅ΠΆΠΈΠΌΠ΅. Если Π²Ρ‹ установитС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΊΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Ρ‚ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅ присущий этому ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ нСдостаток: ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π½Π° полноэкранный Ρ€Π΅ΠΆΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ минимизируСтся. Π­Ρ‚Π° ΡΡ‚Ρ€Π°Π½Π½ΠΎΡΡ‚ΡŒ проявляСтся ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ°ΡŽΡ‚ Π±Π΅Π· ошибок. Как я сказал, этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ являСтся ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанной Π½Π° Π‘. Π’ Π½Π΅Π³ΠΎ внСсСны ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ измСнСния ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с пСрвоисточником, Π½ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΌ пСрСносС Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ усилия для обСспСчСния ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния.

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

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Π²Π΅Π΄Π΅Π½ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π»Π°Π³, ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π»Π°Π³:


flgWindowed : BOOL = True; // Для ΠΎΠ±ΠΎΠΈΡ… Ρ„Π»Π°Π³ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ

First : BOOL = True; // ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ полноэкранного прилоТСния ΠΎΠΊΠ½ΠΎ Π½Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ:


procedure TfrmDD.ApplicationEventslDeactivate(Sender: TObject);

begin

if flgWindowed

then begin

GetWindowRect(Handle, rcWindow); // Π—Π°ΠΏΠΎΠΌΠ½ΠΈΠ»ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΠΊΠ½Π°

if First then First := False; // ΠŸΡ€ΠΎΡˆΠ»Π° пСрвая минимизация

end

else begin

if First

then First := False // ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΡŽ

else Application.Minimize;

end;


end;



Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄ Π·Π½Π°ΠΊΠΎΠΌ ΠΏΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌ, Π½Π΅ стоит, Π΄ΡƒΠΌΠ°ΡŽ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΅Π³ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ, ΠΎΠ±Ρ€Π°Ρ‰Ρƒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ отличия этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:


* ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π·Π°Π΄Π½Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° для ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ прилоТСния Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ OnResize ΠΎΠΊΠ½Π°, ΠΊΠΎΠ³Π΄Π° извСстны Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΠΊΠ½Π°; Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ полоТСния ΠΎΠΊΠ½Π° Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π»Π°ΡΡŒ сСрыми пятнами, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π»ΠΎΠ²ΡƒΡˆΠΊΠ° сообщСния WM_MOVE, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΠΊΠ½Π° ΠΈ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°ΡŽ Π΅Π³ΠΎ; ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ… событий Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ пСрСрисовки ΠΎΠΊΠ½Π° UpdateFrame.

Π’ Ρ†Π΅Π»ΠΎΠΌ, этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ "Π½Π° ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ", я Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅. Но, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π² ΠΎΠΊΠΎΠ½Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ курсор приносит Ρ…Π»ΠΎΠΏΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Π½Π° Π³Ρ€Π°Π½ΠΈΡ†Π°Ρ… ΠΎΠΊΠ½Π°.

ΠžΡΡ†ΠΈΠ»Π»ΠΎΠ³Ρ€Π°Ρ„

НавСрняка ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DirectDraw Π² ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… цСлях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для быстрого отобраТСния Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ ΠΈΠ»ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ².

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ нСсколькими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ случаСм, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎ DirectDraw. Π’ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ осциллограф, показания ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π±Π΅Π³ΡƒΡ‰ΡƒΡŽ синусоиду.

НачнСм с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…31, Π² Π½Π΅ΠΌ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ синусоиды ставятся с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Bit повСрхности, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π½Π° построСниС окруТностСй. НичСго особо Π½ΠΎΠ²ΠΎΠ³ΠΎ Π½Π΅Ρ‚, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ задания Ρ†Π²Π΅Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ функция CreateRGB, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ‚Ρ€ΠΎΠΉΠΊΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ² Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ схСмС 5-6-5.

ΠŸΠ΅Ρ€Π΅Π΄ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…32, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. Он ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ для нас способ нСпосрСдствСнного обращСния ΠΊ памяти повСрхности. Новизна состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ примСняСм Π·Π°ΠΏΠΈΡ€Π°Π½ΠΈΠ΅ памяти, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с повСрхностями, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Π² систСмной памяти.

Π˜Ρ‚Π°ΠΊ, смотрим Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π Π΅ΠΆΠΈΠΌ 640x480x8, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с пиксСлами повСрхности Π·Π°Π²Π΅Π΄Π΅Π½ массив Π±ΡƒΡ„Π΅Ρ€Π° ΠΊΠ°Π΄Ρ€Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ повСрхности:


FrameBuffer : Array [0..99, 0..99] of Byte;

ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌ, Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 100x100 пиксСлов, Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ посмотритС, ΠΊΠ°ΠΊ ΠΎΠ½Π° создаСтся. Π‘Π°ΠΌΠΈ Π·Π°Π΄Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ipitch ΠΈ адрСс содСрТимого Π±ΡƒΡ„Π΅Ρ€Π° ΠΊΠ°Π΄Ρ€Π°:


ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSDJtflDTH or DDSD_HEIGHT or DDSD_LPSURFACE or DDSD_CAPS or

DDSD^PITCH; // НовыС Ρ„Π»Π°Π³ΠΈ!

// ΠŸΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ создаСтся Π² Π‘Π˜Π‘Π’Π•ΠœΠΠžΠ™ памяти

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN or DDSCAPS_SYSTEMMEMORY;

dwWidth := 100;

dwHeight := 100;

IpSurface := @E'rameBuf fer; // АдрСс повСрхности Ρ€Π°Π²Π΅Π½ адрСсу массива

IPitch := Longlnt(100); // АдрСс повСрхности Ρ€Π°Π²Π΅Π½ ΡˆΠΈΡ€ΠΈΠ½Π΅ массива

end;


hRet := FDD.CreateSurface(ddsd, FDDSWork, nil);

if Failed(hRet) then ErrorOut(hRet, 'Create Surface');