FreeBASIC 图形库常见问题
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=FaqPggfxlib2
- 最后更新: 2023-07-09
FreeBASIC 图形库问题:
- 如何链接/使用 Gfxlib?
- fbgfx.bi 头文件是怎么回事?
- Get/Put 数组是如何管理的?
- 为什么 Bsave/Bload 会崩溃?
- 如何获取颜色的红、绿、蓝或 Alpha 分量?
- 如何让窗口标题栏的"x"按钮关闭我的应用程序?
- 无法在全屏模式下运行使用 Screen 13 或 14 的程序!
- 为什么 Imagecreate 返回 NULL 指针?
返回目录
FreeBASIC 图形库问题
如何链接/使用 Gfxlib?
Gfxlib 是语言的"内置"部分,无需包含任何 .bi 文件或显式链接任何库。当你使用 Screen(图形) 或 Screenres 语句时,FreeBASIC 会检测到你想使用 Gfxlib。因此,要使用 Gfxlib,只需启动一个图形屏幕模式并使用图形命令即可。
fbgfx.bi 头文件是怎么回事?
fbgfx.bi 头文件可供你的程序包含使用,其中包含在使用 Gfxlib 时对程序员有帮助的常量和类型定义。但你不必显式包含此文件来使用 Gfxlib;该头文件只是作为辅助工具提供。它包含可传递给 Screen(图形) 和 Screenres 的模式标志常量,以及键盘扫描码 和 fb.Image 缓冲区结构 的定义。
Get/Put 数组是如何管理的?
在 FreeBASIC 中,图像可以作为数组(如在 QB 中)或作为指针来使用。无论哪种方式,图像数据都包含在一个连续的内存块中。该内存块由一个头部加上图像数据组成。头部有两种类型(旧式和新式),决定了后续图像数据的格式,详情请参见 GfxInternalFormats。
为什么 Bsave/Bload 会崩溃?
在 FreeBASIC 中,Bsave/Bload 只能用于加载和保存图形屏幕。它不能用于保存文本模式屏幕。要加载和保存数组,请查看这个使用文件 Get/Put 的代码片段。
如何获取颜色的红、绿、蓝或 Alpha 分量?
颜色属性中的每个字节对应红、绿、蓝和 Alpha 分量。以下示例展示了如何从 16、24 或 32 位颜色属性中提取分量值。
start GeSHi
#define rgb_a(x) ((x) Shr 24)
#define rgb_r(x) ((x) Shr 16 And 255)
#define rgb_g(x) ((x) Shr 8 And 255)
#define rgb_b(x) ((x) And 255)
Dim As UInteger c
Dim As Integer x, y
Dim As UByte red, green, blue, Alpha
'' Assume a 16, 24, or 32 bit screen mode has been set
c = Point(x, y)
red = rgb_r(c)
green = rgb_g(c)
blue = rgb_b(c)
Alpha = rgb_a(c)end GeSHi
如何让窗口标题栏的"x"按钮关闭我的应用程序?
在窗口图形模式下,你可以用 Inkey 检测窗口 X(关闭)按钮的按下,检查值 Chr( 255 ) + "k"(这也是 Alt+F4 返回的代码)。这适用于 Win32 和 Linux,在 DOS 中没有"X"按钮。
这里有一个小示例:
start GeSHi
'' "X" close button example , Win32 and Linux only
Dim As String key
Screen 13
Do
Print "Click the 'x' to close this app."
Sleep
key = Inkey
Loop Until key = Chr(27) Or key = Chr(255, 107) 'escape or x-buttonend GeSHi
无法在全屏模式下运行使用 Screen 13 或 14 的程序!
这是硬件/驱动程序限制(仅限 Win32 和 Linux?)。现代显卡不再实现那些低分辨率图形模式。如果需要全屏,你应该将其重写为至少使用 Screen 17 或 18,或分辨率为 640x480 或更高,以确保现代硬件能够处理。
为什么 Imagecreate 返回 NULL 指针?
Imagecreate 需要创建一个符合当前屏幕像素格式的图像缓冲区,如果尚未设置屏幕模式,它就无法这样做,因此返回 NULL,这很可能导致后续代码中出现 NULL 指针访问,从而使程序崩溃。
已知当 Imagecreate 在图形库通过调用 Screen(图形) 或 Screenres 初始化之前被调用时,就会发生这种情况。例如,当 Imagecreate 在一个全局构造函数中被调用,而该构造函数在程序主体的 Screen 或 Screenres 调用之前执行时,就可能出现这种情况。在这种情况下,有必要将屏幕初始化也移到一个构造函数中,并确保它在创建图像的构造函数之前执行。
参见
返回目录