Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Вниз

Non full screen DirectX...   Найти похожие ветки 

 
Mihey   (2003-06-21 00:24) [0]

Есть код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts, DirectDraw;

type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure ApplicationEvents1Restore(Sender: TObject);
procedure ApplicationEvents1Deactivate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
FDirectDraw : IDirectDraw7;
FPrimarySurface : IDirectDrawSurface7;
BKBitmap : TBitmap;
procedure ErrorOut(hRet : HRESULT);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ErrorOut(hRet: HRESULT);
begin
MessageBox(0, PChar(DDErrorString(hRet)), "Ошибка", MB_OK or MB_ICONSTOP);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
hRet : HRESULT;
SurfaceDesc : TDDSurfaceDesc2;
begin
FPrimarySurface := nil;
FDirectDraw := nil;

hRet := DirectDrawCreateEx (nil, FDirectDraw, IDirectDraw7, nil);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

hRet := FDirectDraw.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

hRet := FDirectDraw.SetDisplayMode (640, 480, 16, 0, 0);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

FillChar (SurfaceDesc, SizeOf(SurfaceDesc), 0);
SurfaceDesc.dwSize := SizeOf(SurfaceDesc);
SurfaceDesc.dwFlags := DDSD_CAPS;
SurfaceDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;
hRet := FDirectDraw.CreateSurface(SurfaceDesc, FPrimarySurface, nil);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

BkBitmap := TBitmap.Create;
BkBitmap.LoadFromFile ("1.bmp");
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FPrimarySurface) then FPrimarySurface := nil;
if Assigned(FDirectDraw) then FDirectDraw := nil;
BkBitmap.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
DC : HDC;
TempCanvas : TCanvas;
hRet : HRESULT;
bltfx : TDDBLTFX;
begin
ZeroMemory(@bltfx, SizeOf(bltfx));
bltfx.dwSize := sizeof(bltfx);
bltfx.dwFillColor := 0;
while True do
begin
hRet := FPrimarySurface.Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, @bltfx);
if hRet = DDERR_SURFACELOST then
begin
hRet := FPrimarySurface._Restore;
if hRet <> DD_OK then Break;
end
else Break;
end;

hRet := FPrimarySurface.GetDC(DC);
if hRet=0 then
begin
TempCanvas := TCanvas.Create;
TempCanvas.Handle := DC;
TempCanvas.Draw(95, 15, BkBitmap);
TempCanvas.Free;
( DC) Есть код:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts, DirectDraw;

type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure ApplicationEvents1Restore(Sender: TObject);
procedure ApplicationEvents1Deactivate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
FDirectDraw : IDirectDraw7;
FPrimarySurface : IDirectDrawSurface7;
BKBitmap : TBitmap;
procedure ErrorOut(hRet : HRESULT);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ErrorOut(hRet: HRESULT);
begin
MessageBox(0, PChar(DDErrorString(hRet)), "Ошибка", MB_OK or MB_ICONSTOP);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
hRet : HRESULT;
SurfaceDesc : TDDSurfaceDesc2;
begin
FPrimarySurface := nil;
FDirectDraw := nil;

hRet := DirectDrawCreateEx (nil, FDirectDraw, IDirectDraw7, nil);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

hRet := FDirectDraw.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

hRet := FDirectDraw.SetDisplayMode (640, 480, 16, 0, 0);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

FillChar (SurfaceDesc, SizeOf(SurfaceDesc), 0);
SurfaceDesc.dwSize := SizeOf(SurfaceDesc);
SurfaceDesc.dwFlags := DDSD_CAPS;
SurfaceDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;
hRet := FDirectDraw.CreateSurface(SurfaceDesc, FPrimarySurface, nil);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

BkBitmap := TBitmap.Create;
BkBitmap.LoadFromFile ("1.bmp");
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FPrimarySurface) then FPrimarySurface := nil;
if Assigned(FDirectDraw) then FDirectDraw := nil;
BkBitmap.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
DC : HDC;
TempCanvas : TCanvas;
hRet : HRESULT;
bltfx : TDDBLTFX;
begin
ZeroMemory(@bltfx, SizeOf(bltfx));
bltfx.dwSize := sizeof(bltfx);
bltfx.dwFillColor := 0;
while True do
begin
hRet := FPrimarySurface.Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, @bltfx);
if hRet = DDERR_SURFACELOST then
begin
hRet := FPrimarySurface._Restore;
if hRet <> DD_OK then Break;
end
else Break;
end;

hRet := FPrimarySurface.GetDC(DC);
if hRet=0 then
begin
TempCanvas := TCanvas.Create;
TempCanvas.Handle := DC;
TempCanvas.Draw(95, 15, BkBitmap);
TempCanvas.Free;
FPrimarySurface.ReleaseDC (DC);
end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_ESCAPE then Close;
end;

procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
begin
WindowState := wsMaximized;
end;

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
Application.Minimize;
end;

end.

Он показывает картинку в полноэкранном режиме. Нужно сделать то же, только чтобы картинка показывалась в оконном режиме 1024х768х24. Что нужно изменить в этом коде?


 
jel   (2003-06-21 12:36) [1]

hRet := FDirectDraw.SetCooperativeLevel(Handle, DDSCL_NORMAL);

Однако это только для этого конкретного случая. В общем случае все немного сложнее. Подробности в справке из DirectX SDK.


 
Mihey   (2003-06-21 19:08) [2]

Сейчас попробую, спасибо за помощь.


 
Mihey   (2003-06-21 19:58) [3]

2 jel:

Ты был прав, не всё так просто и изменение параметра вызвало ошибку. Пробовал запустить в Delphi и извне, но не помогло. Сначала потребовало exclusive mode, я добавил, но пошла ошибка уже вроде бы в цикле рисования формы.


 
Mihey   (2003-06-21 23:51) [4]

Народ! Ну помогите. Очевидно, далее идёт ошибка где-то в прорисовке. Как сделать так, чтобы рисунок выводился на форму? Может, у вас есть свой код?


 
Sapersky_   (2003-06-23 11:58) [5]

Пример, судя по всему, из книги Краснова. Так вот - там есть и примеры оконных приложений. Или см. DelphiGFX. На Королевстве Дельфи были статьи по DX, там, наверное, есть. В общем, это базовая теория, и информацию по ней достаточно легко найти.
Могу и так сказать - SetDisplayMode не надо. И ещё учитывать положение и размеры окна (GetWindowRect). И вообще вывод обычно делается в задний буфер (backbuffer). Только не надо спрашивать, что это такое :)


 
Mihey   (2003-06-23 19:19) [6]

Ладно ребята, не дождался помощи я от вас, но ничего, выберусь.. сам выберусь.


 
jel   (2003-06-24 09:35) [7]

hRet := FDirectDraw.SetDisplayMode (640, 480, 16, 0, 0);
if hRet <> DD_OK then
begin
ErrorOut(hRet);
Close;
Exit;
end;

Вот это при работе в оконном режиме не пройдет и будет требовать Exclusive


 
Mihey   (2003-06-24 13:15) [8]

Буду разбираться.


 
Kelegorm   (2003-06-24 18:59) [9]

Ну, блин. А книга Краснова зачем. По-моему, там это есть. Щас посмотрю.


 
Kelegorm   (2003-06-24 19:05) [10]

"Вы, должно быть, привыкли к тому, что наши примеры -//- в полноэкранном режиме. -//- Экранный режим нужно исп. в случае крайней нужды. -/(долго рисуется)/- Свойство BorderStyle = bsSizeable, потом как сказал jel, уврать все компоненты с формы. Если нужно подробнее (вост экрана, перерисовка, сообщи в форуме. всем привет, пишите мне. У меня книга есть.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
14-25602
antonyan
2003-12-17 13:05
2004.01.09
Нужен русский help


7-25624
Serg
2003-10-27 14:13
2004.01.09
System Folder


1-25441
pashtet
2003-12-23 17:06
2004.01.09
Диаграмма Ганнта..


14-25532
reticon
2003-12-19 11:01
2004.01.09
Кто-нибудь еще помнит язык ДОСа?


1-25332
незнайка
2003-12-22 10:37
2004.01.09
Окно MessageDlg и его расположение на экране...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский