http://seprize.narod.ru

Создание главной поверхности. (часть 2)

В начале необходимо обнулить все объекты COM, можно этого не делать, но это делается для повышения надежности приложения. Может получиться что исполняем файл, который нормально работал где-то не заработает. Так что лучше перестраховаться, тем более что при работе с DirectX очень часто необходимо проверять успешность выполняемых действий. Что конечно же можно и не делать но это может повлиять на некоторые особенности.

Например может получиться так, что после того как вы свернете и развернете свое приложение оно будет не в состоянии работать, после казалось бы обычного действия. Кстати такое я замечал вроде в профессионально созданных программах.

После обнуления объектов уже необходимо создать главный объект DirectDraw.

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

Можно вообще-то сделать код более коротким исключив проверку успешности события. тогда пример будет уже более короткого вида.

DirectDrawCreateEx (nil, FDD, IDirectDraw7, nil);

Далее задаем уровень кооперации объекта, используя метод SetCooperativeLevel. Уровень кооперации определяет уровень взаимодействия приложения с экраном и с другими приложениями. И это действие - задание уровня кооперации - является обязательным для всех приложений, использующих DirectDraw. Метод имеет два параметра: первый является идентификатором окна приложения, здесь мы передаем значение свойства Handleформы, второй параметр представляет собой одно из строго определенных значений, либо комбинацию значений.

Используемая комбинация битовых флагов записана в этом примере как "DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE". В подобных случаях всегда слово or можно заменить знаком +. Первый флаг задает полноэкранный режим работы приложения, второй задает монопольный режим доступа к экрану. Оба флага в комбинации должны присутствовать.

Из этого следует что мы запросили полноэкранный режим работы приложения, и рас мы используем весь экран, то по правилам DirectX  установили эксклюзивный уровень доступа к экрану. По этой причине окно распахивается на весь экран.

Затем мы создаем первичную поверхность. Поверхность является основным из понятий при работе с DirectDraw, на самом деле это всего лишь блок памяти, который для нас представляется в довольно удобном виде. его можно сравнить с прямоугольным изображением. примерно как объект Canvas.

Если вы имеете практику рисования с помощью Canvas, то немного будет сходно. Некоторые веши вам покажутся знакомыми, хотя и изменения будут.

Далее создаются поверхности с помощью метода CreateSurface главного объекта, но для задания свойств создаваемой поверхности используется вспомогательная величина типа TDDSurfaceDesc2. Значения ее полей содержат параметры создаваемой поверхности. Не всегда следует заполнять все поля, можно обойтись только некоторыми, остальные поля будут заполнены автоматически. Но что обязательно сделать так это обнулить все поля структуры. Это очень важно, без этого приложение не будет работоспособно. Делается это про помощи функции ZeroMemory или FillChar:

FillChar(ddsd, SizeOf(ddsd), 0);
или
ZeroMemory (@ddsd, SizeOf(ddsd));

Оба варианты правильные.

Следующим действием мы записываем размер структуры в поле dwSize Установка размера и обнуление полей это два обязательные действия, без который программа теряет работоспособность. Если удалить любую строчку, то программа завершается с ошибкой.

Поле dwFlags структуры TDDSurface2 содержит указания, какие из ее полей заполнены нами и какие должны быть приняты системой в расчет. Если мы поместим в поле структуры значение, но не укажем это в поле флагов, то графическая система установленные значения в расчет принимать не будет.

Поверхностей может быть сколько угодно, но существует одна особенная, связанная непосредственно с экраном. Все что на ней будет выведено окажется непосредственно на экране монитора. Называется эта поверхность первичной Она обязательно присутствует в любом проекте.

В поле dwCaps структуры ddsCaps, являющейся, в свою очередь, частью структуры ddsd, заносим значение DDSCAPS_PRIMARYSURFACE, вызывая метод CreateSurface главного объекта. У объекта три аргумента: адрес структуры, описывающей параметры создаваемой структуры, переменная, в которую помещается результат - созданная поверхность. Третий параметр всегда nil, такое значение ему необходимо задавать, потому что этот параметр зарезервирован для будущих нужд, для совместимости и пока не используется.

При завершении работы приложения переменные должны освобождаться (присваиваться им значение nil в обратном порядке их связывания.)

Электронная почта автора  

< Часть 1 | Часть 2 >

. : навигация : .

главная
DirectX
уроки
словарь
гостевая книга
о проекте
 
.: DirectX :.
введение
уроки
файлы
 

статистика

RAMBLER'S TOP100

Если вы используете материалы с данного сайта, то сообщите владельцу по почте
и вставьте ссылку на этот сайт "seprize.narod.ru"
seprize@narod.ru

© Сайт открылся 04.09.2002     Дата последнего обновления 28.09.2002

Сайт управляется системой uCoz