Using the Mouse in FreeBASIC
 

在进行一些搜索之后,我很快就注意到,在FreeBasic中的Windows控制台应用程序中,根本没有一个官方的教程或技术来操纵鼠标。因此,为了给FreeBasic社区提供一个例子,我决定写这个技术。你知道Windows控制台已经通过Windows控制台的方式已经被鼠标识别了,这意味着它是通过使用Windows API创建的,这意味着可以从控制台窗口访问鼠标。所以没有必要在代码中打开或关闭鼠标。所有您需要做的是获取或设置X和Y坐标并获取鼠标按钮的状态。我们将在本教程中介绍以下主题。

  • 获取鼠标坐标:
当鼠标移动时,鼠标光标会不断更新其位置。您可以获取这些值来确定当前指针在屏幕上的位置。

  • 设置鼠标坐标:
由于某些原因,可能需要将鼠标指针放在与指针当前位置不同的位置。

  • 获取鼠标按钮状态:
很简单,当用户按下鼠标上的按钮时,它返回一个值,表示按下一个按钮,以及按哪些按钮。通过这些值,您可以决定执行代码的哪一部分。

与大多数教程一样,使用示例程序也可以更好地解释这一点。我们将创建一个非常简单的程序,其作用是与用户与鼠标和屏幕某些区域的交互。它应该提供在您自己的编程项目中有效地操作和控制鼠标所需的代码基础。

重要信息:为了使用鼠标,必须将自己设置为图形模式。如果图形模式未设置,鼠标命令将始终返回值-1。

THE SAMPLE PROGRAM DESCRIPTION

为了演示程序,事情将会非常简单,直截了当。该程序将在屏幕顶部显示3个项目,根据您点击的其中一个将在屏幕上显示不同的消息。这应该给你足够的信息,以了解如何在FreeBasic中使用鼠标。

在FreeBasic中,当您尝试处理项目中的鼠标时,基本上有2个命令需要担心。在这里,他们的语法根据文档解释。

--------------------------------------------------------------------------------

语法

GetMouse的x,y [, [wheel][, [buttons]]]

说明

GETMOUSE检索鼠标位置和按钮状态。

当功能被调用时,鼠标位置存储在X和Y中。如果鼠标不在程序窗口中,则X和Y将为-1。

“轮”是鼠标轮计数器。将轮子从您身上旋转,使计数增加,向您转动使其减少。如果鼠标不存在或不在程序窗口中,则滚轮将保持-1。

“按钮”存储按钮状态。在功能终止时,这将返回一个保持按钮状态的位掩码。如果鼠标左键停止,则位0置位;如果鼠标右键关闭,则设置位1;如果鼠标中键处于关闭状态,则位2置位。

* GETMOUSE用于图形模式,仅使用SCREEEN命令设置*


---------------------------------------------------------------------------------

语法

SETMOUSE x,y,可见性

说明

SETMOUSE将设置鼠标指针的X,Y坐标,并设置其可见性。

使用X和Y参数设置鼠标位置。

如果可见性设置为1,鼠标将可见,如果可见性设置为0,则该鼠标将不可见。

* SETMOUSE仅用于使用SCREEN语句启动的图形模式。*

--------------------------------------------------------------------------------

THE CODING BEGINS

这是我在模块开始时声明的一组常量。这只是为了在编程示例的其余部分获得一点清晰的代码。
    Const LEFTBUTTON = 1 
    Const MIDDLEBUTTON = 4 
    Const RIGHTBUTTON = 2 
    Const SHOWMOUSE = 1
    Const HIDEMOUSE = 0 

作为本例中的第一步,我们将声明将在整个示例程序中使用的变量。当然,你不需要声明你的变量,但是我喜欢这样做,因为当你这样做时,你知道你为什么声明你的变量。对我来说,这是很好的做法。
    Dim CurrentX As Integer 
    Dim CurrentY As Integer
    Dim MouseButtons As Integer
    Dim CanExit As Integer
    Dim As String A,B,C

这里的想法是在循环中完成所有操作,以便我们也可以控制程序如何退出。因此,当“Can Exit”变量等于0时,我们将创建一个将退出的循环。在循环中,我们将询问鼠标并打印一些基本值。(这部分是从gfxlib.txt文件中的GETMOUSE语法说明中提供的示例中提取的)。不要忘记设置你的图形模式,因为它是必须的,以从鼠标命令获得有效的返回值。我们将以屏幕12为例。
Screen 12 
CanExit = 1
 
Do While CanExit <> 0 
    GetMouse CurrentX, CurrentY, , MouseButtons 
    If CurrentX < 0 Then
     Print "Mouse is out of context." 
    Else
    If MouseButtons And LEFTBUTTON Then A="L"
    If MouseButtons And MIDDLEBUTTON Then B="M"
    If MouseButtons And RIGHTBUTTON Then C="R"
     Print Using "Mouse position: ###:### Buttons: &&&"; CurrentX; CurrentY;A;B;C 
     A="":B="":C=""     
    End If 
Loop

该示例将基本上连续显示关于鼠标位置的信息,如果它在程序窗口上,并且按任何鼠标按钮。GETMOUSE语句基本上将当前的X和Y坐标放在我们的当前X和当前Y变量中,以及鼠标Buttons变量中的鼠标按钮的状态。如果按下左按钮,三个如果语句将打印L,如果按下了中间按钮(或车轮),则M如果按下了右按钮则为R。

对于下一步,由于我们想要控制鼠标发生的情况,所以在程序开始时会显示一些额外的东西,并且在循环中控制它们之后会发生什么。这是正在显示的正文,这可以被一系列的行命令取代,或是为不同的选项画一个按钮。但这不在本教程的范围之内。到目前为止,通过从上面的代码中删除不需要的打印语句,循环应该如下所示:
    Screen 12 
    SetMouse 1, 1, 1
    CanExit = 1
    Locate 1,1
    Print " | FIRST | SECOND | THIRD | EXIT | "
    Do While CanExit <> 0
     Locate 1,1
     GetMouse CurrentX, CurrentY, , MouseButtons
    Loop 

基本上我们打印屏幕顶部有“| FIRST | SECOND | THIRD | EXIT |”的行。我们进入询问鼠标的循环。当然,如果按下一个按钮,现在没有任何事情会发生,因为没有代码。在我们的示例中,我们将添加简单打印选择的选项的代码。如果用户选择EXIT选项,我们将打印选项,我们将退出循环。我们还会在循环之外添加一个打印语句,并使用sleep来告诉我们我们真的在循环之外,因此程序结束了。所有这一切,代码现在应该是这样的。我将整个源文件放在这里,以便您轻松剪切和粘贴。
Const LEFTBUTTON   = 1
Const MIDDLEBUTTON = 4   ' UNUSED IN THIS DEMO
Const RIGHTBUTTON  = 2   ' UNUSED IN THIS DEMO
Const SHOWMOUSE    = 1
Const HIDEMOUSE    = 0

Dim CurrentX     As Integer
Dim CurrentY     As Integer
Dim MouseButtons As Integer
Dim CanExit      As Integer

Screen 12
SetMouse 1, 1, SHOWMOUSE
CanExit = 1
Locate 1,1
Print " | FIRST | SECOND | THIRD | EXIT | "

Do
   GetMouse CurrentX, CurrentY, , MouseButtons
   If MouseButtons And LEFTBUTTON Then
      If CurrentY <= 12 Then
         If CurrentX >= 0 And CurrentX <=75 Then
            Locate 12, 1
            Print "First Option Selected ";
         ElseIf CurrentX >= 76 And CurrentX <= 147 Then
            Locate 12, 1
            Print "Second Option Selected";
         ElseIf CurrentX >= 148 And CurrentX <=212 Then
            Locate 12, 1
            Print "Third Option Selected ";
         ElseIf CurrentX >= 213 And CurrentX <=268 Then
            Locate 12, 1
            Print "Last Option Selected  ";
            Exit Do
         End If
      End If
   End If
Loop While Inkey$ = ""

SetMouse 1, 1, HIDEMOUSE
Print
Print "AND NOW WE'RE OUT OF THE LOOP"
Sleep


您可以在最后一段代码中看到许多IF语句。已经按照SCREEN 12返回的坐标测量了那些数字。它们应该在所有图形模式下工作,因为像素是控制台图形窗口中的像素。每个if表示在屏幕上写入不同选项的位置。如果您使用图形按钮例程,您可以简单地使用与您在这些if语句中绘制按钮相同的宽度和高度,以了解哪个按钮被点击。

IN CONCLUSION

如您所见,使用鼠标在FreeBasic中已经非常简单。您可以使用简单的语句(如打印命令)绘制屏幕,??也可以使用像LINE这样的图形命令以图形方式绘制屏幕。无论您选择哪种方式绘制屏幕,??SETMOUSE和GETMOUSE语句将以相同的方式工作并返回相同的值。所有你需要做的是得到这些信息,并使你的程序做你想要他们做的,如果他们按下一个按钮,选择一个选项,或者甚至在游戏的情况下,你可以很容易地使主角移动到位置你也在屏幕上点击了。选择取决于你。

一如以往,如果您对本教程或其他任何其他文章有任何疑问,请随时给我发电子邮件,我们将会看到我们可以解决您的特定问题。


MystikShadows
史蒂芬理查德
srichard@adaworld.com