Использование мыши в FreeBASIC
 

После выполнения некоторых поисков, я быстро заметил, что нет официального учебника для пояснения того, как манипулировать мышью FreeBasic приложениях. Поэтому я решил написать эту статью, чтобы дать пример FreeBasic сообществу. Все, что вам нужно делать с помощью мыши - это получить или задать координаты X и Y и получить состояния кнопок мыши. Мы будет охватывать следующие темы в учебнике:

  • Получение координат мыши:
Курсор мыши, когда указатель мыши перемещается, постоянно обновляет свою позицию. Вы можете получить эти значения, и тем самым определить, где указатель находится в настоящее время на экране.

  • Установка координат мыши:
Иногда может возникнуть необходимость в установке положения указателя мыши в другом месте , отличном от текущего расположения.

  • Получение статуса нажатия кнопок мыши:
Это довольно просто. Когда пользователь нажимает кнопку мыши, возвращается значение, которое говорит какая кнопка нажата. В зависимости от этих значений вы можете решить, какая часть кода должна выполняться.

Как и в большинстве учебников, лучше всего получается объяснить с использованием примеров программ. Мы будем создавать очень простые программы, которые направлены на взаимодействие пользователя с помощью мыши и некоторых областей экрана. Примеры должны обеспечить базу кода, необходимую для эффективного управления и контролирования мыши в собственных программных проектах.

Важно: Обязательно установите графический режим для того, чтобы использовать мышь. Команды мыши всегда будет возвращать значение -1 , если не установлен графический режим.

ОПИСАНИЕ , пример программы

Демонстрационная программа будет настолько проста, насколько возможно. Программа покажет 3 пункта в верхней части экрана и в зависимости от того, на который вы щелкните, различные сообщения будут отображаться на экране. Это должно дать вам достаточно информации, чтобы знать, как работать с мышью в FreeBASIC.

В FreeBASIC есть 2 команды, которые вы можно использовать для управления мышью. Вот их синтаксис в соответствии с документацией.

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

Синтаксис

GETMOUSE x, y[, [wheel][, [buttons]]]

Описание

GETMOUSE извлекает позиции и статус кнопок мыши.

Положение мыши хранится в X и Y, когда функция вызывается. Если мышь не в окне программы, Х и Y будет -1.

'wheel' является счетчиком колеса мыши. Поворот колеса от вас делает увеличение счетчика. Вращение по отношению к вам уменьшает счетчик. Если мышь отсутствует или вне окна программы, значение будет -1.

'buttons' сохраняет состояние кнопки. По завершении работы функции будет возвращена битовая маска статуса кнопок. Бит 0 устанавливается, если левая кнопка мыши нажата; бит 1 устанавливается, если правая кнопка мыши нажата; бит 2 устанавливается, если средняя кнопка мыши нажата.

*GETMOUSE предназначена для использования в графических режимах, устанавливается только при наличии команды Screen с режимом более нуля (Screen 0 - это консоль, поэтому с ней функция тоже не будет работать).*


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

Синтаксис

SETMOUSE x, y, visibility

Описание

SETMOUSE установит X, Y координаты указателя мыши, а также устанавливает видимость мыши.

Положение мыши устанавливается с помощью параметров X и Y.

Мышь будет видна, если visibility установлен в 1, и не видна, если visibility установлен в 0.

*SETMOUSE предназначена для использования в графических режимах, устанавливается только при наличии команды Screen с режимом более нуля (Screen 0 - это консоль, поэтому с ней функция тоже не будет работать).*

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

Начало кодирования

Вот набор констант, которые я объявляю в начале модуля. Это для того, чтобы получить немного ясности в коде.
    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

Идея заключается в том, чтобы сделать всю работу в цикле. Мы создадим цикл, который завершает работу, когда переменная «CanExit» равна 0. В цикле мы опрашиваем мышь и распечатываем некоторые значения. (Эта часть извлекается из примера, приведенного в объяснении синтаксиса GETMOUSE в файле gfxlib.txt). Не забудьте установить графический режим , чтобы возвращались допустимые значения от команд мыши. Для нашего примера мы будем использовать экран с режимом 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 в наши переменные CurrentX и CurrentY , а состояние кнопок мыши в нашу переменную MouseButtons. Три IF заявления будут печатать 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   ' не используется в этом примере
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

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 мы проверяем координаты , которые рассчитаны с учетом размеров и расположений надписей. На основе этих координат, мы как раз и высчитываем какая опция была нажата.

В ЗАКЛЮЧЕНИЕ

Как вы могли заметить, использование функций GETMOUSE и SETMOUSE очень простое.

Как всегда, если у вас есть любые вопросы относительно этого учебника или любого другого материала, который я написал, вы можете связаться со мной по электронной почте и мы разрешим все ваши проблемы. 

От переводчика: В этой статье было слишком много пояснений , которые после перевода могли только запутать , поэтому данная статья была заметно изменена.


MystikShadows
Stйphane Richard
srichard@adaworld.com