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');