Direct Draw по русски
Как создавать поверхности DirectDraw
Для того, чтобы создать хоть одну поверхность, нужно представлять себе, что же это такое. DirectDraw - представляет из себя интерфейс устройства (в данном случае - видеокарты) и предлагает нам для работы так называемые поверхности, над которыми мы можем производить всяческие операции. Для успешной работы любого приложения нам необходимо (!!!) иметь по крайней мере ДВЕ поверхности. Одну - первичную (PrimarySurface) и соответственно вторичную. Пользователь всегда видит перед собой первичную поверхность. В это же самое время мы можем спокойно рисовать на вторичной поверхности все, что нам вздумается. И как только мы все нарисовано, мы просто переносим готовое изображение со вторичной поверхности на первичную. Все! В этом - то и заключается вся суть DirectDraw.
Другое дело КАК мы можем переключать поверхности. Нужно сказать, что первичная поверхность обладает одним (из многих) хорошим свойством. Она может присоединять к себе другие поверхности. Что же у нас получается? Если мы создаем первичную поверхность, а затем присоединим к ней еще одну, то у нас появляются две “страницы”, которые будут переключаться между собой методом flip. Если же мы присоединим еще одну поверхность, то теперь метод flip будет переключать их по порядку.
Итак. Приступим к созданию поверхностей. Первое, что нам нужно сделать, это убедиться, что в Uses включен модуль DDraw. Если это до сих пор не сделано, то я прямо и не знаю, что дальше-то будет.
Uses DDraw, . . . . . . ;
Следующим шагом будет определение объектов DirectDraw.
var
. . . . .
DDResult : Hresult;
DDrawObject : IDirectDraw;
PrimarySurface : IDirectDrawSurface;
SecondarySurface : IDirectDrawSurface;
SurfaceDescription: TDDSurfaceDesc;
BackCaps: TDDSCaps;
Описание мы закончили, теперь начнем сроить эти самые поверхности.
begin
. . . . .
. . . . .
DDResult := DirectDrawCreate (nil,DDrawObject,nil);
DDResult := DDrawObject.SetCooperativeLevel (handle, DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN);
DDResult := DDrawObject.SetDisplayMode (640,480,16);
with SurfaceDescription do begin
dwSize := sizeof(SurfaceDescription);
dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
ddsCaps.dwCaps :=DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
DwBackBufferCount := 1;
end;
DDResult := DDrawObject.CreateSurface (SurfaceDescription,PrimarySurface,nil);
BackCaps.dwCaps := DDSDCAPS_BACKBUFFER;
PrimarySurface.GetAttachedSurface (BackCaps,SecondarySurface);
PrimarySurface.Flip(nil, DDFLIP_WAIT);
. . . . . .
end.
Вроде бы все, но нет!!! Не торопитесь запускать программу. Мы же с Вами так и не написали процедуру уничтожения поверхностей. Так давайте же её поскорее напишем.
procedure FreeAll;
begin
SecondarySurface._Release;
pointer(SecondarySurface):=nil;
PrimarySurface._Release;
pointer(PrimarySurface):=nil;
DDrawObject._Release;
pointer(DDrawObject):=nil;
end;
Вот теперь можно запустить программку и воочию убедится, что на вторичной поверхности содержится всякая белиберда. У меня например это похоже на несоответствие кадровой развертки моему типу монитора. Продолжение здесь. |