Шаг 6 - Создаем объект DirectDraw

Из прошлого шага мы знаем, что в результате вызова DirectDrawCreate будет создан объект DirectDraw. Но результат выполнения этой функции может быть отрицательный. Первая возможная причина - это неправильное указание GUID драйвера. Но даже если мы установим драйвер по умолчанию, самой библиотеки DirectDraw может не быть у пользователя. Мы создадим метод InitDirectDraw который будет иметь тип BOOL. В случае удачи метод вернет TRUE иначе FALSE.

Visual Basic
Visual C++

Visual Basic

Добавляем метод к классу clDirectDraw

Public Function InitDirectDraw() As Boolean
End Function

Для того, что бы создавать объекты классов нам нужно объявить их переменные. Нам нужно две переменные DirectX7 и DirectDraw7.

6_1.gif (3771 b)

Они будут частные. Теперь напишем саму функцию инициализации.

Public Function InitDirectDraw() As Boolean
On Error GoTo Errors:
    Set objDirectX = New DirectX7
    Set objDirectDraw = objDirectX.DirectDrawCreate("")
    InitDirectDraw = True
    Exit Function
Errors:
  InitDirectDraw = False
End Function

Все готово. При загрузки формы мы будет инициализировать DirectDraw и если ошибка, то сообщать пользователю и закрывать приложение.

Private Sub Form_Load()
If (DirectDrawClass.InitDirectDraw() = False) Then
	ErrorForm.Show 1
	End
End If
End Sub

Я добавил еще одну форму, что бы показать сообщение об ошибке.

6_2.gif (9022 b)

Но получив ссылку на объект ее нужно освободить. Когда будет закрываться формы, будет разрушаться класс. Вот самое место.

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

Visual C++

Для работы нам нужно объявить две переменные. Первая это указатель на интерфейс DirectDraw, а вторая результат вызова функции. Потом создать саму функцию InitDirectDraw.

class CDirectDraw  
{
public:
	BOOL InitDirectDraw();
	CDirectDraw();
	virtual ~CDirectDraw();
private:
	LPDIRECTDRAW  lpDD;
	HRESULT rezult;
};

Пишем функцию InitDirectDraw.

BOOL CDirectDraw::InitDirectDraw()
{
rezult = DirectDrawCreate(NULL, &lpDD, NULL );
if( rezult != DD_OK )  return FALSE;
return TRUE;
}

Хорошо, но есть вопрос, где производить инициализацию. Для приложений на базе диалогового окна инициализация производить в функции OnInitDialog. Будем инициализировать.

BOOL CDirectDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	.............
	// TODO: Add extra initialization here
	if (cDirecDraw.InitDirectDraw() !=TRUE)
	{
		CErrorDirectDraw ce;
		ce.DoModal(); 
		return FALSE;
	}
	return TRUE;  // return TRUE  unless you set the focus to a control
}

Класс CErrorDirectDraw это класс диалогового окна которое я создал в ресурсах.

6_3.gif (6838 b)

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

CDirectDraw::CDirectDraw()
{
	lpDD=NULL;
}

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

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