Графика для Windows средствами DirectDraw | страница 56



Вторая функция — CreateSurface() — создает поверхность заданных размеров. Эта функция полезна в тех случаях, когда вам нужна новая поверхность, содержимое которой не связано с BMP-файлом. Данная версия CreateSurface() реализована так:

>LPDIRECTDRAWSURFACE DirectDrawWin::CreateSurface(DWORD w, DWORD h) {

> DWORD bytes=w*h*(displaydepth/8);

> DDSURFACEDESC desc;

> ZeroMemory(&desc, sizeof(desc));

> desc.dwSize = sizeof(desc);

> desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;

> desc.dwWidth = w;

> desc.dwHeight = h;

> desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |   DDSCAPS_VIDEOMEMORY;

> LPDIRECTDRAWSURFACE surf;

> HRESULT r=ddraw2->CreateSurface(&desc, &surf, 0);

> if (r==DD_OK) {

>  TRACE("CreateSurface(%d,%d) created in video memory \n", w, h);

>  return surf;

> }

> desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;

> r=ddraw2->CreateSurface(&desc, &surf, 0);

> if (r==DD_OK) {

>  TRACE("CreateSurface(%d,%d) allocated in system memory \n", w, h);

>  return surf;

> }

> TRACE("CreateSurface(%d,%d) failed\n", w, h);

> return 0;

>}

Функция CreateSurface() с помощью структуры DDSURFACEDESC описывает поверхность, размеры которой равны передаваемым параметрам w и h. Поле dwFlags показывает, какие поля структуры будут инициализироваться. Поля dwWidth и dwHeight определяют размеры поверхности, а поле dwCaps — ее возможности. Обратите внимание на флаг DDSCAPS_VIDEOMEMORY, согласно которому создаваемая поверхность должна находиться в видеопамяти.

Затем мы вызываем функцию DirectDraw CreateSurface(). В качестве первого аргумента передается указатель на структуру с описанием поверхности; если вызов окажется успешным, указатель surf будет ссылаться на созданную поверхность.

При успешном создании поверхности макрос MFC TRACE() выводит отладочное сообщение, а вы получаете указатель surf. Тем не менее раз мы явно указали, что поверхность должна находиться в видеопамяти, при нехватке последней вызов CreateSurface() может закончиться неудачно. В этом случае мы изменяем поле dwCaps, заносим в него флаг DDSCAPS_SYSTEMMEMORY и снова вызываем функцию CreateSurface(). Скорее всего, вторая попытка окажется успешной; если и на этот раз поверхность не будет создана, функция возвратит 0.

Но давайте вернемся к списку функций DirectDrawWin для работы с поверхностями. Функция LoadSurface() загружает содержимое BMP-файла в существующую поверхность. Эта функция будет часто упоминаться, когда речь пойдет о восстановлении потерянных поверхностей. Функция