C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 21 - Создаем функцию ClearSurfSecond / DirectDraw / Microsoft DirectX

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

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

  • DDERR_WASSTILLDRAWING - Предыдущая операция, которая работает с поверхностью не завершена
  • DDERR_SURFACELOST - Доступ отказан, так как поверхность потерена

В первом случае можно вызывать опять 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);
	}
}

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


Загрузить проект | | |
Автор Каев Артем.
[AD]