FreeBASIC Screenptr
目次→描画ライブラリー参考→描画画面関連→SCREENPTR←オリジナル・サイト
現在の作業ページのフレーム・バッファに、ポインタを返します。
構文:
用法:
result = Screenptr
戻り値:
現在の作業ページのフレーム・バッファ・メモリへのポインタ、または、描画モードでないなら 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
方言差:
-
-lang qb 方言では、別名 __Screenptr と共に参照をつけない場合、利用できません。
QBからの違い:
参照:
ページ歴史:2023-07-09 00:14:03
日本語翻訳:WATANABE Makoto、原文著作者:SysOp