Frequently Asked FreeBASIC Graphics Library Questions
 



FreeBASIC图形库问题:



FreeBASIC图形库问题


如何链接/使用Gfxlib?
Gfxlib“内置”到语言中,没有必要包含任何.bi文件或者明确链接任何库。当您使用屏幕ScreenRes语句时,FreeBASIC会检测到您想要使用Gfxlib。所以要使用Gfxlib,只需启动图形屏幕模式并使用图形命令。

回到顶部

fbgfx.bi头文件怎么办?
fbgfx.bi头文件可供您的程序包含,并包含常量和类型定义,这些定义可能对程序员使用Gfxlib有帮助。您不必明确地将此文件包含在使用Gfxlib中;标题只能作为辅助。它包含可以传递给屏幕ScreenRes的模式标志的常量,以及键盘扫描码fb.Image缓冲结构的定义。

回到顶部

Get / Put数组如何管理?
在FreeBASIC中,图像可以用作数组(如QB)或指针。无论哪种方式,图像数据都包含在一个连续的块中。该块由一个头部,后跟图像数据组成。标题可以是两种类型(旧式和新式),并确定以下图像数据的格式,详细信息请参阅GfxInternalFormats。

回到顶部

为什么Bsave / Bload崩溃?
Bsave / Bload只能用于在FreeBASIC中加载和保存图形屏幕。它不能用于保存文本模式屏幕。要加载并保存阵列,请检查此代码段使用文件Get / Put.

回到顶部

如何获得颜色的红色,绿色,蓝色或alpha组件?

颜色属性中的每个字节对应于红色,绿色,蓝色和Alpha组件。以下示例显示如何从16,24或32位颜色属性中提取组件值。

#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)


回到顶部

如何使窗口标题中的“x”按钮关闭我的应用程序?
在窗口图形模式下,您可以使用Inkey测试窗口的X(关闭)按钮,检查值Chr(255)+“k”(也是Alt + F4返回的代码)。这适用于Win32和Linux,在DOS中没有“X”按钮。

这是一个小例子:

'' "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-button


回到顶部

无法使用全屏屏幕13或14运行程序!
这是硬件/驱动程序限制(仅限Win32和Linux?)。视频卡现在不实现那些低分辨率图形模式。如果需要全屏,您应该至少使用屏幕17或18进行重写,或者分辨率为640x480或更高,以确保现代硬件能够处理。

回到顶部

为什么Imagecreate返回NULL指针?
ImageCreate需要创建一个适合当前屏幕像素格式的图像缓冲区,如果没有屏幕模式设置,则不能执行此操作,因此它返回NULL,很可能导致稍后的NULL指针访问导致程序崩溃。

当Imagecreate被调用before 图形库被初始化为屏幕ScreenRes的调用时,就会发生这种情况,这可能会在在Screen或Screenres调用之前调用的全局构造函数中调用Imagecreate时发生该计划的主要部分。在这种情况下,有必要将屏幕初始化移到构造函数中,并在图像创建构造函数之前执行它。

回到顶部

参考