Из прошлого шага мы знаем, что в результате вызова DirectDrawCreate будет создан объект DirectDraw. Но результат выполнения этой функции может быть отрицательный. Первая возможная причина - это неправильное указание GUID драйвера. Но даже если мы установим драйвер по умолчанию, самой библиотеки DirectDraw может не быть у пользователя. Мы создадим метод InitDirectDraw который будет иметь тип BOOL. В случае удачи метод вернет TRUE иначе FALSE.
Visual Basic Добавляем метод к классу clDirectDraw
Для того, что бы создавать объекты классов нам нужно объявить их переменные. Нам нужно две переменные DirectX7 и DirectDraw7.
Они будут частные. Теперь напишем саму функцию инициализации.
Все готово. При загрузки формы мы будет инициализировать DirectDraw и если ошибка, то сообщать пользователю и закрывать приложение.
Я добавил еще одну форму, что бы показать сообщение об ошибке.
Но получив ссылку на объект ее нужно освободить. Когда будет закрываться формы, будет разрушаться класс. Вот самое место.
Для работы нам нужно объявить две переменные. Первая это указатель на интерфейс DirectDraw, а вторая результат вызова функции. Потом создать саму функцию InitDirectDraw.
Пишем функцию InitDirectDraw.
Хорошо, но есть вопрос, где производить инициализацию. Для приложений на базе диалогового окна инициализация производить в функции OnInitDialog. Будем инициализировать.
Класс CErrorDirectDraw это класс диалогового окна которое я создал в ресурсах.
И это окно будет появляться при возникновении ошибки. Последнее, получив указатель на интерфейс нужно не забыть его освободить при выходе из программы. Когда мы будет закрывать диалоговое окно, будет разрушаться класс тут то мы и освободим интерфейс.
Visual C++
Visual Basic
Public Function InitDirectDraw() As Boolean
End Function
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
Private Sub Form_Load()
If (DirectDrawClass.InitDirectDraw() = False) Then
ErrorForm.Show 1
End
End If
End Sub
Private Sub Class_Terminate()
Set objDirectX = Nothing
Set objDirectDraw = Nothing
End Sub
Visual C++
class CDirectDraw
{
public:
BOOL InitDirectDraw();
CDirectDraw();
virtual ~CDirectDraw();
private:
LPDIRECTDRAW lpDD;
HRESULT rezult;
};
BOOL CDirectDraw::InitDirectDraw()
{
rezult = DirectDrawCreate(NULL, &lpDD, NULL );
if( rezult != DD_OK ) return FALSE;
return TRUE;
}
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
}
CDirectDraw::CDirectDraw()
{
lpDD=NULL;
}
CDirectDraw::~CDirectDraw()
{
if (lpDD!=NULL)
lpDD->Release();
}