После выполнения некоторых поисков, я быстро заметил, что нет официального
учебника для пояснения того, как манипулировать мышью
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