ScreenPtr
 
Возвращает указатель на буфер кадров текущей рабочей страницы

Синтаксис

Declare Function ScreenPtr ( ) As Any Ptr

Использование

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

  • Новое в FreeBASIC

См. также