Графика DirectX в Delphi | страница 20



*

Глава 2. Обзор библиотеки DirectDraw


Поверхности

Блиттинг

Буферы

Отладка приложений

Что вы узнали в этой главе


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

Примеры к данной главе располагаются в каталоге \Examples\Chapter02.

Поверхности

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

Рассмотрим проект каталога Ex01. Имя формы frmDD задано, в разделе private описания класса формы объявлены две переменные и вспомогательная функция:


FDD : IDirectDraw7; // Главный объект

FDDSPrimary : IDirectDrawSurface7; // Поверхность

procedure ErrorOut(hRet : HRESULT; FuncName : String); // Вывод сообщений

Вспомогательная функция вывода сообщений получает в качестве аргументов код ошибки и поясняющее сообщение и выводит расшифровку кода, используя функцию DDErrorString:


procedure TfrmDD.ErrorOut(hRet : HRESULT; FuncName : String); begin

MessageBox(0, PChar(FuncName + ': ' + #13 + DDErrorString(hRet)),

PChar (Caption) , MBJDK or B_ICONSTOP);

end;



Обработчик события onCreate формы дополнился новыми для нас действиями, которые мы должны очень внимательно разобрать:


procedure TfrmDD.FormCreate(Sender: TObject); var

hRet : HRESULT; // Для анализа успешности действий

ddsd : TDDSurfaceDesc2; // Вспомогательная структура begin

FDDSPrimary := nil; //В начале работы обнуляем все СОМ-объекты

FDD := nil;

// Создание главного объекта DirectDraw

hRet := DirectDrawCreateEx (nil, FDD, IDirectDraw7, nil);

if hRet <> DD_OK then begin

ErrorOut(hRet, 'DirectDrawCreateEx'); Exit;

end;


// Задаем уровень кооперации

hRet := FDD.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or

DDSCL_EXCLUSIVE); if hRet <> DD_OK then begin

ErrorOut(hRet, 'SetCooperativeLevel'); Exit;

end;


// Заполняем поля вспомогательной структуры

FillChar(ddsd, SizeOf(ddsd), 0); // Для начала все поля обнуляем ddsd.dwSize := SizeOf(ddsd); // Поле размера структуры ddsd.dwFlags := DDSD_CAPS; // Будет создаваться первичная поверхность ddsd.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;

// Собственно создание первичной поверхности