Шаг 14 - Реализуем функцию создания первичной поверхности

Мы с Вами создадим метод CreatePrimarySurf. В этом методе мы будем создавать первичную поверхность. Так как создание первичной поверхности может завершиться ошибкой, метод будет BOOL и возвращать TRUE в случае успеха и FALSE в случае ошибки. Если первичную поверхность создать не удается, программа завершается.

Visual Basic
Visual C++

Visual Basic

Описывает переменную поверхности.

.......
Private PrimarySurf As DirectDrawSurface7
.......

Создаем метод, который заполняет структуру DDSURFACEDESC2 необходимыми данными и создает объект поверхности.

Public Function CreatePrimarySurf() As Boolean
On Error GoTo Errors:
 strsurf.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
 strsurf.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
 strsurf.lBackBufferCount = 1
 Set PrimarySurf = objDirectDraw.CreateSurface(strsurf)
 CreatePrimarySurf = True
 Exit Function
Errors:
CreatePrimarySurf = False
End Function

При загрузке формы создаем поверхность, если ошибка выходим.

Private Sub Form_Load()
........
If (DirectDrawClass.CreatePrimarySurf() = False) Then
MsgBox ("Error Create Primary")
End
End If
End Sub

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

Private Sub Class_Terminate()
Set PrimarySurf = Nothing
Set objDirectDraw = Nothing
Set objDirectX = Nothing
End Sub

Visual C++

Описывает переменную поверхности.

class CDirectDraw  
{
...........
private:
	LPDIRECTDRAW  lpDD;
	LPDIRECTDRAWSURFACE PrimarySurf;
	HRESULT rezult;
	DDSURFACEDESC strsurf;
};

Создаем функцию, который заполняет структуру DDSURFACEDESC необходимыми данными и создает объект поверхности.

BOOL CDirectDraw::CreatePrimarySurf()
{
	strsurf.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; 
	strsurf.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; 
	strsurf.dwBackBufferCount = 1;
	if (lpDD->CreateSurface(&strsurf,&PrimarySurf,NULL) !=DD_OK)
		return FALSE;
	return TRUE;
}

При загрузке диалогового окна создаем поверхность, если ошибка выходим.

BOOL CDirectDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	.....................
	if (cDirecDraw.CreatePrimarySurf()  !=TRUE)
	{
		AfxMessageBox("Error Set Mode");
		return FALSE;
	}

	return TRUE;  // return TRUE  unless you set the focus to a control
}

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

CDirectDraw::~CDirectDraw()
{
	if (PrimarySurf!=NULL)
		PrimarySurf->Release();	

	if (lpDD!=NULL)
		lpDD->Release();
}

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 23.04.2002