Итак, мы добавим в функцию ClearSurfSecond код для очистки этой поверхности. И будем вызывать эту функцию при загрузке окна. Раньше мы вызывали ее по нажатию на клавишу. Нажатие мы оставим для других целей. Техника очистки простая, мы получаем указать на поверхность, и устанавливаем все пиксели в 0.
Visual Basic Переносим очистку в функцию загрузки формы.
Теперь получим указатель на поверхность и произведем очистку.
Переносим очистку в функцию загрузки диалога.
Теперь получим указатель на поверхность и произведем очистку.
Visual C++
Visual Basic
Private Sub Form_Load()
...........
...........
If (DirectDrawClass.ClearSurfSecond() = False) Then
MsgBox ("Error Clear")
End If
End Sub
Public Function ClearSurfSecond() As Boolean
On Error GoTo Errors:
Dim tempRECT As RECT
Dim MyArray() As Byte
SecondarySurf.Lock tempRECT, DdsdSecond, DDLOCK_WAIT Or DDLOCK_SURFACEMEMORYPTR, 0
' Место под код работы с поверхностью, пока пустое
SecondarySurf.GetLockedArray MyArray()
For x = 0 To DdsdSecond.lWidth - 1
For y = 0 To DdsdSecond.lHeight - 1
MyArray(x, y) = 0
Next y
Next x
'
SecondarySurf.Unlock tempRECT
ClearSurfSecond = True
Exit Function
Errors:
ClearSurfSecond = False
End Function
Visual C++
BOOL CDirectDlg::OnInitDialog()
{
............
if (cDirecDraw.ClearSurfSecond() !=TRUE)
{
AfxMessageBox("Error Clear");
return FALSE;
}
return TRUE; // return TRUE unless you set the focus to a control
}
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;
// Место под код работы с поверхностью, пока пустое
char* buf = (char*)DdsdSecond.lpSurface;
memset(buf,0,(DdsdSecond.dwHeight * DdsdSecond.dwHeight));
//
if (SecondarySurf->Unlock(NULL)!=DD_OK) return FALSE;
return TRUE;
}