FreeBASIC マニュアルのトップに戻る

FreeBASIC Screenptr

目次→描画ライブラリー参考→描画画面関連SCREENPTR←オリジナル・サイト

SCREENPTR 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

現在の作業ページのフレーム・バッファに、ポインタを返します。

構文:
declare function Screenptr ( ) as any PTR

用法:
result = Screenptr

戻り値:
現在の作業ページのフレーム・バッファ・メモリへのポインタ、または、描画モードでないなら NULL(0)、がセットされます。

記述:
Screenptr は、作業ページのフレーム・バッファに対して、直接 読み書きする方法を提供します。
SCREENLOCK は、読み書きをしようとする前に、常に使用されます。
返されたポインタは、その後の Screen (描画) または SCREENRESの呼び出しまで有効です。(SCREENRESはポインタを無効にします)。

また、 Screenptr は、Screen (描画)SCREENRES への呼び出しがうまくいったかどうかテストするのに使用できます。うまく行くと、戻り値は、非NULL(<>0)になります。

スクリーン・バッファで画素にアクセスするために、画面の、画素当たりのバイト数と、ピッチ(1列当たりのバイト数)を知っている必要があります。更に、境界線を越えて行くことを避けるためにと、幅と高さも知っている必要があります。
この情報は、Screeninfo を使って知ることができます。
フレーム・バッファの各々の列は、pitch バイトの長さです。
フレーム・バッファは height 列で構成されます。そして、画面のその位置の順に保存されます。そして、上から下まで、左から右に走査します。

FreeBASIC の描画ライブラリの設計から、Screenptr (非NULL の場合) は、常にバック・バッファーを指して、実際のビデオ RAM を指すことはありません。

例:
注:FreeBASIC 1.08〜 で、SetEnviron を追加しなくても、日本語環境で描画画面が表示されるように改善されました。
' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")

Const SCREEN_WIDTH = 640, SCREEN_HEIGHT = 480
Dim As Long w, h, bypp, pitch

'' 8ビットの画面を作ります
ScreenRes SCREEN_WIDTH, SCREEN_HEIGHT, 8

'' 画面情報を取得(w と h は上の定数に合うべきであり、bypp は 1 であるべきです)
ScreenInfo w, h, , bypp, pitch

'' フレーム・バッファのアドレスを取得します。
'' 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


' Sets the graphics method GDI
' 描画方法を GDI に設定
SetEnviron("fbgfx=GDI")

Const SCREEN_WIDTH = 256, SCREEN_HEIGHT = 256
Dim As Long w, h, bypp, pitch

'' 8ビットの画面を作ります。
ScreenRes SCREEN_WIDTH, SCREEN_HEIGHT, 32

'' 画面情報を取得します (w と h は上の定数に合うべきであり、bypp は 4 であるべきです)
ScreenInfo w, h, , bypp, pitch

'' フレーム・バッファのアドレスを取得します
'' Ptr は、ここで、簡単なポインタ演算を許すために、使用されます
Dim buffer As Any Ptr = ScreenPtr ()
If (buffer = 0) Then
    Print "Error: graphics screen not initialized."
    Sleep
    End -1
End If

'' ダイレクト・フレーム・バッファ・アクセスを許すために、画面をロックします
ScreenLock ()

    '' バッファの始まりに、ロー・アドレスを設定します
    Dim As Any Ptr row = buffer

    '' 画面で、すべての画素を繰り返します

    For y As Integer = 0 To h - 1

        '' 列の始まりに、画素アドレスを設定します
        '' 32ビットの画素なので、ULong Ptr を使います
        Dim As ULong Ptr pixel = row

        For x As Integer = 0 To w - 1

            '' ピクセル値を設定します
            * pixel = RGB (x, x Xor y, y)

            '' 次の画素アドレスを取得します
            '' (ULong Ptr は、4バイトずつ増加するでしょう)
            pixel += 1

        Next x

        '' 次の列に行きます
        row += pitch

    Next y

'' 画面をロック解除します
ScreenUnlock ()

'' ユーザが、プログラムを終えるために、キーを押すのを待ちます
Sleep


Screenptr 方言差:
QBからの違い:
参照:

描画画面関連に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2023-07-09 00:14:03
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承