WINDOW
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgWindow
- 最后更新: 2022-12-18
为当前视口设置新的视图坐标映射
语法
` Window [ [Screen] ( x1, y1 )-( x2, y2 ) ]
`
参数
Screen
可选参数,指定 y 坐标从上到下递增。
( x1, y1 )-( x2, y2 )
映射到当前视口对角的新浮点坐标值。若省略,则移除 Window 坐标映射。
说明
Window 用于定义新的坐标系统。(x1, y1) 和 (x2, y2) 是映射到当前视口对角的新坐标;此后传递给图形基元语句的所有坐标都将受到此新映射的影响。若省略 Screen,新坐标系统将为笛卡尔坐标系,即 y 坐标从下到上递增。不带参数调用 Window 可禁用坐标变换。
FreeBASIC 目前的行为是追踪 Window 的角坐标,而非特定的坐标映射。这意味着调用 View 后坐标映射可能会发生变化。
目前在处理图像缓冲区时也会考虑 Window 的角坐标,因此当 Window 生效时,不同图像的坐标映射可能各不相同。
当没有 Window 生效时,也不存在坐标映射,因此有效坐标系是固定的,与图像缓冲区大小或 View 坐标(如有)无关。
示例
start GeSHi
vb
'' 该程序演示如何通过更改当前视口的视图坐标映射来改变屏幕上绘制图形的大小。
'' 效果类似于缩放(放大和缩小):
'' - 视口坐标越小,图形在屏幕上显示越大,直到部分内容被裁剪(超出窗口范围)。
'' - 视口坐标越大,图形在屏幕上显示越小。
Declare Sub Zoom (ByVal X As Integer)
Dim As Integer X = 500, Xdelta = 50
Screen 12
Do
Do While X `< 525 And X >` 50
X += Xdelta '' 改变窗口大小。
Zoom(X)
If Inkey <> "" Then Exit Do, Do '' 按键时停止。
Sleep 100
Loop
X -= Xdelta
Xdelta *= -1 '' 反转大小变化方向。
Loop
Sub Zoom (ByVal X As Integer)
Window (-X,-X)-(X,X) '' 定义新窗口。
ScreenLock
Cls
Circle (0,0), 60, 11, , , 0.5, F '' 绘制 x 半径为 60 的椭圆。
ScreenUnlock
End Subend GeSHi
start GeSHi
vb
Screen 13
'' 定义裁剪区域
View ( 10, 10 ) - ( 310, 150 ), 1, 15
'' 设置视图坐标
Window ( -1, -1 ) - ( 1, 1 )
'' 绘制 X 轴
Line (-1,0)-(1,0),7
Draw String ( 0.8, -0.1 ), "X"
'' 绘制 Y 轴
Line (0,-1)-(0,1),7
Draw String ( 0.1, 0.8 ), "Y"
Dim As Single x, y, s
'' 计算步长(对应 x 坐标上 1 像素的步进)
s = 2 / PMap( 1, 0 )
'' 绘制函数曲线
For x = -1 To 1 Step s
y = x ^ 3
PSet( x, y ), 14
Next x
'' 恢复屏幕坐标
Window
'' 移除裁剪区域
View
'' 绘制标题
Draw String ( 120, 160 ), "Y = X ^ 3"
Sleepend GeSHi
与 QB 的差异
- QBASIC 在后续调用 VIEW 之后保留坐标映射。
- FreeBASIC 目前的行为是在调用 VIEW 或操作图像时保留 WINDOW 坐标,这意味着坐标映射可能会经历缩放/平移。(如果未设置 WINDOW,则不存在坐标映射,因此调用 VIEW 后也不会改变。)该行为在未来可能会发生变化,但可以通过每次更改 VIEW 时重新调用 WINDOW 来确保在视口坐标不一致的情况下行为一致。
另请参阅
Screen(图形)View(图形)PMap
返回 目录