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

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

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

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

// УстанавливаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния для ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности

hRet := FDDSPrimary.SetClipper(FDDClipper);

if Failed (hRet) then ErrorOut(hRet, 'SetClipper FAILED^);


ΠœΠΎΠΆΠ΅Ρ‚Π΅ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ отсСчСния ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ строку с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ offsetRect, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ своСй клиСнтской области. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° окаТСтся искаТСнной, Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π½Π΅ испортит Π²ΠΈΠ΄ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола.

Одно нСбольшоС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… DirectX SDK ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния Π½Π΅ удаляСтся ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹, я ΠΆΠ΅ дСлаю это Π² ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ. Π›Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ это: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, связанный с отсСчСниСм, ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ΅ ΠΎΡ‚ nil, Π° Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Π»ΡƒΡ‡ΡˆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΈΠΌ. Π’Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта пСрСмСнная присваиваСтся nil сразу послС присоСдинСния ΠΊ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности.

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании отсСчСния нСльзя ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ BitFast.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…27, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ‚Π΅ΠΌΡƒ ΠΎΠΊΠΎΠ½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, отличаСтся ΠΎΠ½ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ курсором (рис. 3.13).





Π‘ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ приходится ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, для экономии памяти Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ создаСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°:


procedure TfrmDD.FormResize(Sender: TObject);

var

hRet : HRESULT;

ddsd : TDDSurfaceDesc2;

begin

if Assigned(FDDSBack) then FDDSBack := nil;

ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD_CAPS or DDSDJiEIGHT or DDSD_WIDTH;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

dwWidth := ClientWidth; // Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ

dwHeight := ClientHeight; // ΠΎΠΊΠ½Π°

end;


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

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

FormPaint (nil);

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ курсором ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° Π»ΡŽΠ±ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ клиСнтской области ΠΎΠΊΠ½Π°. Для отсСчСния Π½ΡƒΠΆΠ½ΠΎΠΉ части повСрхности ΠΎΠ±Ρ€Π°Π·Π° (Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ 32x32 пиксСла) объявлСна пСрСмСнная rcMouse Ρ‚ΠΈΠΏΠ° TRECT. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ курсора Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΎΠΊΠ½Π° оставляСм для воспроизвСдСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Π°:


procedure TfrmDD.FormMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

var

wrkl, wrkJ : Integer;

begin

mouseX := X;

if X < ClientWidth - 32

then wrkl := 32 // По Π₯ помСщаСтся вСсь растр

else wrkl := ClientWidth - X; // Π’ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Π°

mouseY := Y;

if Y < ClientHeight - 32

then wrkJ := 32 // По Y помСщаСтся вСсь растр

else wrkJ := ClientHeight - Y; // Π’ΠΎΡΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Π°

SetRect (rcMouse, 0, 0, wrkl, wrkJ); // Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΎΠ±Ρ€Π°Π·Π°

FormPaint (nil); // ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ пСрСрисовываСм ΠΎΠΊΠ½ΠΎ

end;


ΠŸΡ€ΠΈ пСрСрисовкС ΠΎΠΊΠ½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ BitFast приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° растрового изобраТСния курсора:


procedure TfrmDD.FormPaint(Sender: TObject);

var

rcDest, wrkRect : TRECT;

p : TPOINT;

begin

p.X := 0;

p.Y := 0;

Windows.ClientToScreen(Handle, p);

Windows.GetClientRect(Handle, rcDest);

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

SetRect (wrkRect, 0, 0, ClientWidth, ClientHeight);

//На Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΎΠ½Π°

if Failed (FDDSBack.Blt (SwrkRect, FDDSBackGround, nil,

DDBLT^WAIT, nil}) then if Failed (RestoreAll) then Exit;

// ΠŸΠΎΠ²Π΅Ρ€Ρ… Ρ„ΠΎΠ½Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ растровоС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ курсора

if Failed (FDDSBack.BltFast (mouseX, mouseY, FDDSImage, @rcMouse,

DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY))

then if Failed (RestoreAll) then Exit;

// ΠšΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ содСрТимоС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ повСрхности Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΡƒΡŽ

if Failed (FDDSPrimary.Blt (@rcDest, FDDSBack, nil, DDBLT__WAIT, nil))

then if Failed (RestoreAll) then Exit;

end;


Для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ отобраТСния курсора Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈΠ±Π΅Π³Π½Π΅ΠΌ ΠΊ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌΡƒ способу: Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ showcursor. Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ False. Однако с курсором ΠΎΡΡ‚Π°Π»Π°ΡΡŒ связанной ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ Π² области Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Ρ€Π°ΠΌΠΊΠΈ ΠΎΠΊΠ½Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ курсор ΠΌΡ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, Π° систСмный ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½. Полного Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π½Π΅Π»Π΅Π³ΠΊΠΎ, Ссли Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ курсор Π² Π»ΠΎΠ²ΡƒΡˆΠΊΠ΅ сообщСния WM_NCMOUSEMOVE, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ курсора Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ клиСнтской части ΠΎΠΊΠ½Π°, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ нСустойчивым, придСтся всС Ρ€Π°Π²Π½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ курсора Π² ΠΎΠΊΠ½ΠΎ.

Π‘Π°ΠΌΠΎΠ΅ простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ курсора Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ OnMouseMove, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ курсора Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ† ΠΎΠΊΠ½Π°. Но для Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ функционирования Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π°Π΄ΠΎ Π»ΠΈΠ±ΠΎ бСспрСрывно ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ, Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ высокой скорости Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΡ‹ΡˆΡŒΡŽ.

Π’ΡΠΊΠΎΠ»ΡŒΠ·ΡŒ я ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ», Ρ‡Ρ‚ΠΎ для повСрхностСй ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ пиксСла. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…28, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π—Π΄Π΅ΡΡŒ Π²Π²Π΅Π΄Π΅Π½Π° пСрСмСнная Pixel Format Ρ‚ΠΈΠΏΠ° TDDPixelFormat; послС создания ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠΉ повСрхности заносим Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π² Π΄Π°Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ:


ZeroMemory(@PixelFormat, SizeOf(PixelFormat));

PixelFormat.dwSize := SizeOf(PixelFormat);

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ пиксСла

hRet := FDDSPrimary.GetPixelFormat(PixelFormat);

if Failed (hRet) then ErrorOut(hRet, 'GetPixelFormat');

ΠŸΡ€ΠΈ создании Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ повСрхности явно устанавливаСм Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ пиксСла:


ZeroMemory(@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

// Добавился Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π»Π°Π³

dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH or DDSD_PIXELFORMAT;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

ddpfPixelFormat := PixelFormat; // УстанавливаСм Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ повСрхности

dwWidth := ClientWidth;

dwHeight := ClientHeight;

end;


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

ΠšΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ прилоТСния

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

Π’ΠΎΡ‚ ΠΈ всС тонкости, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ прилоТСниями, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ - ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π•Ρ…29. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ являСтся ΠΌΠΎΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° Delphi ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° DirectX 7.0 SDK. Π Π°Π±ΠΎΡ‚Π° прилоТСния ΠΎΡ‡Π΅Π½ΡŒ простая: ΠΏΠΎ экрану пСрСмСщаСтся ΠΎΠ΄ΠΈΠ½ΠΎΠΊΠΈΠΉ ΠΊΡ€ΡƒΠΆΠΎΠΊ, ΠΎΡ‚ΡΠΊΠ°ΠΊΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΎΡ‚ Π³Ρ€Π°Π½ΠΈΡ† ΠΎΠΊΠ½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π±ΠΈΠ»ΡŒΡΡ€Π΄Π½ΠΎΠΌΡƒ ΡˆΠ°Ρ€Ρƒ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ запускаСтся Π² полноэкранном Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π² Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π½Π°ΠΆΠ°Π² ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ клавиш <Alt>+<Enter>, ΠΎ Ρ‡Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ подсказка, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰Π°ΡΡΡ Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ экрана (рис. 3.14).





Для упрощСния кодирования повСдСния ΠΊΡ€ΡƒΠΆΠΎΡ‡ΠΊΠ° ΠΎΠΊΠ½ΠΎ прилоТСния устанавливаСм 640x480 пиксСлов ΠΈ Π½Π΅ допускаСм измСнСния Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ²:


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

NewHeight: Integer; var Resize: Boolean);

begin

Resize := False; // Π—Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ Π»ΡŽΠ±Ρ‹Π΅ измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π°

end;


Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ для этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π»ΡƒΡ‡ΡˆΠ΅ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ области экрана большими, Ρ‡Π΅ΠΌ принятыС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π’Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ связаны с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ ΠΊΡ€ΡƒΠ³Π° Π½Π° экранС, Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ двиТСния ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ области Π²Ρ‹Π²ΠΎΠ΄Π°:


// ΠšΡ€ΡƒΠ³ рисуСтся срСдствами GDI, вписанным Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚

xl : Integer =0; // Π›Π΅Π²Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

yl : Integer = 0;

Ρ…2 : Integer =40; // ΠŸΡ€Π°Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°

Ρƒ2 : Integer = 40;

xDir : Integer =4; // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ X

yDir : Integer =4; // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Y

rcScreen : TRECT; // ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ ΠΎΠΊΠ½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°

rcViewport : TRECT; // ΠžΠ±Π»Π°ΡΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄Π°, 640x480

rcWindow : TRECT; // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° для хранСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠΊΠ½Π° Π½Π° экранС

flgWindowed : BOOL = False; // Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния


Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° создания ΠΎΠΊΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ°:



procedure TfrmDD.FormCreate(Sender: TObject);

var

hRet : HRESULT;

begin

// ΠžΠ±Π½ΡƒΠ»ΡΠ΅ΠΌ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ DirectDraw

FDDClipper := nil; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ отсСчСния Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒΡΡ Π΄Π²Π°ΠΆΠ΄Ρ‹,

FDDSBack := nil; // ΠΌΠΎΠΆΠ½ΠΎ этого ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, Π½ΠΎ для коррСктности

FDDSPrimary := nil; // ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° FormCreate Π»ΡƒΡ‡ΡˆΠ΅ всС-Ρ‚Π°ΠΊΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ

FDD := nil;

//Π’ зависимости ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌΠ° Π·Π°Π΄Π°Π΅ΠΌ ΡΡ‚ΠΈΠ»ΡŒ Ρ€Π°ΠΌΠΊΠΈ ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ курсора

if flgWindowed then begin

BorderStyle := bsSizeable; // ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΡΡ‚ΠΈΠ»ΡŒ, с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

ShowCursor(True);

end

else begin

BorderStyle := bsNone; // Π‘Π΅Π· Ρ€Π°ΠΌΠΊΠΈ ΠΈ области Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

ShowCursor(False);

end;


// БоздаСтся Π³Π»Π°Π²Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ DirectDraw

hRet := DirectDrawCreateEx (nil, FDD, IDirectDraw7, nil);

if Failed(hRet) then ErrorOut(hRet, 'DirectDrawCreateEx');

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ повСрхностСй

if Failed (InitSurfaces(Handle)) then Close;

FActive := True;

end;


ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ повСрхностСй ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π² сСбС ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΈΠ·ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π°ΠΌΠΈ для полноэкранного ΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠΎΠ²: