Шаг 21 - Создаем функцию ClearSurfSecond

Данная функция в последствии будет производить очистку поверхности, а пока по нажатию пробела проводить блокировку - разблокировку. Обратите внимание что начальную инициализацию мы провели, и теперь начинаем реагировать на событие после инициализации основных объектов программы. Следует обратить внимание на функцию Lock которая может вернуть ошибку блокировки. Но не все ошибки фатальные и должны вести к завершению программы. Есть две ошибки, которые могут быть обработаны.

В первом случае можно вызывать опять Lock что бы дождаться блокировки. Во втором случаем поверхность нужно восстановить (Restore), об этом пока не рассказано. Восстановленную поверхность придется повторно загружать графическими изображениями.

Итак, создаем функцию ClearSurfSecond которая может вернуть ошибку, поэтому будет BOOL. В случае успешной блокировки и разблокировки вернет TRUE, иначе FALSE.

Visual Basic
Visual C++

Visual Basic

Описываем переменную для информации о поверхности.

...............
Private objDirectDraw As DirectDraw7
Private DdsdSecond As DDSURFACEDESC2

Создаем метод и пишем в нем код для блокировки, разблокировке.

Public Function ClearSurfSecond() As Boolean
On Error GoTo Errors:
	Dim tempRECT As RECT
	SecondarySurf.Lock tempRECT, DdsdSecond, DDLOCK_WAIT Or DDLOCK_SURFACEMEMORYPTR, 0
	' Место под код работы с поверхностью, пока пустое

	'
	SecondarySurf.Unlock tempRECT
	ClearSurfSecond = True
	Exit Function
Errors:
	ClearSurfSecond = False
End Function

И привязываем этот метод к нажатию клавиши на форме.

Private Sub Form_KeyPress(KeyAscii As Integer)
If (DirectDrawClass.ClearSurfSecond() = True) Then
 Beep
End If
End Sub

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

Visual C++

Описываем переменную для информации о поверхности.

class CDirectDraw  
{
public:
................
	DDSURFACEDESC strsurf;
	DDSURFACEDESC DdsdSecond;
};

Создаем функцию и пишем в нем код для блокировки, разблокировке.

BOOL CDirectDraw::ClearSurfSecond()
{
	memset(&DdsdSecond,0,sizeof(DDSURFACEDESC));
	DdsdSecond.dwSize = sizeof(DDSURFACEDESC);
	if (SecondarySurf->Lock(NULL,&DdsdSecond,DDLOCK_WAIT |
		DDLOCK_SURFACEMEMORYPTR,NULL)!=DD_OK) return FALSE;

	// Место под код работы с поверхностью, пока пустое
    
	//

	if (SecondarySurf->Unlock(NULL)!=DD_OK) return FALSE; 
	return TRUE;
}

И привязываем эту функцию к нажатию клавиши на диалоге.

void CDirectDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
	if (cDirecDraw.ClearSurfSecond()==TRUE)
	{
		MessageBeep(MB_ICONHAND);
	}
}

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


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