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


Функции для работы с поверхностями


Наше приложение Bounce является очень простым, поэтому функция CreateCustom Surfaces() делает не так уж много. Реальное приложение может создавать десятки и даже сотни поверхностей. Класс DirectDrawWin содержит несколько служебных функций, которые могут пригодиться при работе с поверхностями, поэтому мы ненадолго отвлечемся от приложения Bounce и рассмотрим эти функции:


LPDIRECTDRAWSURFACE CreateSurface(LPCTSTR filename, BOOL installpalette=FALSE); LPDIRECTDRAWSURFACE CreateSurface(DWORD w, DWORD h ); BOOL LoadSurface(LPDIRECTDRAWSURFACE surf, LPCTSTR filename); BOOL ClearSurface(LPDIRECTDRAWSURFACE surf, DWORD clr, RECT* rect=0); BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD r, DWORD g, DWORD b, RECT* rect=0 ); BOOL GetSurfaceDimensions( LPDIRECTDRAWSURFACE surf, DWORD& w, DWORD& h );


Первая функция нам уже знакома. Функция CreateSurface(), получая имя BMP-файла, создает новую поверхность на основании его содержимого. Кроме того, эта функция может извлекать палитру из 8-битных файлов и назначать ее поверхности. Реализация этой функции подробно рассматривается в главе 5.

Вторая функция - 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; }

<


Начало  Назад  Вперед