Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > DirectDraw


Автор: Rave4Life 14.8.2007, 13:30
Всем привет)

Я пишу на Делфи программку, которая работает с DirectDraw. Суть программы - полупрозрачная прорисовка окна (AlphaBlending) с помощью средств DirectX, но не используя API функции типа SetLayeredWindow.
Создавать Primary Surface, работать напрямую с видеопамятью я научился. Но вот "заставить" окно моей программы прорисовываться не в основной области (PrimarySurface), а на другой, я не могу. Помогите пожалуйста  найти способ это сделать. Заранее благодарен)))

Автор: Bitter 16.8.2007, 22:37
Вот инициализация DirectX:

Код

procedure TForm1.FormCreate(Sender: TObject);
var
    ddsd:TDDSurfaceDesc2;
    ddscaps : TDDSCaps2;
begin
 MainObj:=nil;
 MainSur:=nil;
 BackSur:=nil;

 DirectDrawCreateEx(nil,MainObj,IDirectDraw7,nil);
 MainObj.SetDisplayMode(1024,768,32,0,0);
 MainObj.SetCooperativeLevel(Handle,DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);

 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;

 res:=MainObj.CreateSurface(ddsd,MainSur,nil);   // Создаем первичную поверхность

 ZeroMemory(@ddscaps, SizeOf(ddscaps));
 ddscaps.dwCaps := DDSCAPS_BACKBUFFER;
 res:=MainSur.GetAttachedSurface(ddscaps, BackSur);  // Создаём вторичную поверхность (бэк буфер)
end;


Вот рендер:

Код

procedure TForm1.UpdateFrame;
begin
 BackSur.BltFast(0,0,FonSur,nil,DDBLTFAST_WAIT);
 MainSur.Flip(BackSur,DDFLIP_WAIT);
end;


А вообще старайся избегать DIrectDraw. Делай всё в Direct3D

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)