Возвращает указатель на буфер кадров текущей рабочей страницы
Синтаксис
Использование
result = ScreenPtr
Возвращаемое значение
указатель текущую рабочую страницу памяти буфера кадра, или NULL (0) если не
включен режим графики.
Описание
ScreenPtr предоставляет способ для непосредственного
чтения/записи рабочей страницы буфера кадров.
ScreenLock
должна использоваться до попытки любого чтения или записи. Возвращенный
указатель является действительным вплоть до любого последующего вызова
функций
Screen или
ScreenRes,
создающих его.
ScreenPtr может также использоваться для проверки об успешном
вызове
Screen или
ScreenRes,
возвращая ненулевое (
<> 0) значение.
Чтобы получить доступ к точке в буфере экрана, вам будет нужно знать
bytes per pixel (кол-во байт на пиксель) и
pitch
(кол-во байт в строке), а также ширину и высоту экрана чтобы не выйти за
пределы. Эту информацию можно найти с помощью
ScreenInfo.
Каждая строка в буфере кадров
pitch байт длинной. Буфер
кадров состоит из
height(высоты) строк, хранящихся в порядке
их положения на экране, сверху вниз, слева направо.
Из-за конструкции FreeBASIC графической библиотеки,
ScreenPtr (если
ненулевой) всегда будет указывать на задний буфер и никогда на фактическое
видео
RAM.
Пример
Const SCREEN_WIDTH = 640, SCREEN_HEIGHT = 480
Dim As Integer w, h, bypp, pitch
'' Создаем 8-битовый экран.
ScreenRes SCREEN_WIDTH, SCREEN_HEIGHT, 8
'' Получаем информацию об экране (w и h должны соответствовать
константам выше, bypp должно быть 1)
ScreenInfo w, h, , bypp, pitch
'' Получить адрес буфера кадров. Тип Any Ptr
'' здесь используется для арифметической простоты работы
с указателем
Dim buffer As Any Ptr = ScreenPtr()
If (buffer = 0) Then
Print "Error: graphics screen not initialized."
Sleep
End -1
End If
'' Блокировка экрана, чтобы разрешить прямой доступ к
кадровому буферу
ScreenLock()
'' Найти адрес пикселя в центре
экрана
'' Это 8-битный пиксель, так что
используем UByte Ptr.
Dim As Integer x = w \ 2, y = h \ 2
Dim As UByte Ptr pixel = buffer + (y * pitch) + (x * bypp)
'' Задаем цвет пикселя в 10
(светло-зеленый).
*pixel = 10
'' Разблокировать экран.
ScreenUnlock()
'' Ждем нажатия любой клавиши
перед закрытием программы
Sleep
Const SCREEN_WIDTH = 256, SCREEN_HEIGHT = 256
Dim As Integer w, h, bypp, pitch
'' Создаем 32-битный экран.
ScreenRes SCREEN_WIDTH, SCREEN_HEIGHT, 32
'' Получаем информацию об экране (w и h должны
соответствовать константам выше, bypp должно быть 4)
ScreenInfo w, h, , bypp, pitch
'' Получить адрес буфера кадров. Тип Any Ptr
'' здесь используется для арифметической простоты работы
с указателем
Dim buffer As Any Ptr = ScreenPtr()
If (buffer = 0) Then
Print "Error: graphics screen not initialized."
Sleep
End -1
End If
'' Блокировка экрана, чтобы
разрешить прямой доступ к кадровому буферу
ScreenLock()
'' Установить адрес
row на начало буфера
Dim As Any Ptr row = buffer
'' Перебор всех пикселей на
экране:
For y As Integer = 0 To h - 1
'' Установить
адрес pixel начальным row
'' Это
32-битный пиксель, так что используем UInteger Ptr
Dim As UInteger Ptr pixel = row
For x As Integer = 0 To w - 1
'' Устанавливаем
значение пиксела
*pixel = RGB(x, x Xor y, y)
'' Получить
следующий адрес пикселей
'' (UInteger Ptr будет
увеличивать на 4 байта)
pixel += 1
Next x
'' Перейдите
к следующей строке
row += pitch
Next y
'' Разблокировать экран.
ScreenUnlock()
'' Ждем нажатия
любой клавиши перед закрытием программы
Sleep
Различие диалектов
- Не доступно в диалекте -lang qb
, но есть псевдоним __Screenptr.
Отличия от QB
См. также