Данная функция в последствии будет производить очистку поверхности, а пока по нажатию пробела проводить блокировку - разблокировку. Обратите внимание что начальную инициализацию мы провели, и теперь начинаем реагировать на событие после инициализации основных объектов программы. Следует обратить внимание на функцию 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);
}
}