Графика для 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-файла в существующую поверхность. Эта функция будет часто упоминаться, когда речь пойдет о восстановлении потерянных поверхностей. Функция