Visual studio управление мышью
В предыдущем уроке мы узнали, как добавить интерактивности приложениям OpenGL с помощью клавиатуры и функционала GLUT. Теперь пришло время изучить работу с мышью. Интерфейс мыши GLUT предоставляет собой множество вариантов использования, а именно обнаружение кликов и движения мыши.
Обнаружение щелчков мыши
Как и в случае с клавиатурой, GLUT предлагает Вам способ, чтобы зарегистрировать функцию, которая будет отвечать за обработку событий, создаваемых щелчками клавиш мыши. Название этой функции glutMouseFunc. Синтаксис выглядит следующим образом:
*func - имя функции, которая будет обрабатывать события мыши.
Как мы видим, с момента подписания glutMouseFunc, функция, которая будет обрабатывать события мыши, должна иметь 4 параметра. Первый из них касается того, какая кнопка была нажата или отпущена. Этот аргумент может иметь одно из трех значений:
- GLUT_LEFT_BUTTON;
- GLUT_MIDDLE_BUTTON;
- GLUT_RIGHT_BUTTON;
Второй аргумент относится к состоянию кнопки, то есть идентификации момента нажатия и отпускания кнопки. Возможные значения:
- GLUT_DOWN;
- GLUT_UP;
Если ответный вызов генерируется со статусом GLUT_DOWN, приложение может предположить, что GLUT_UP будет после этого события, даже если мышь перемещается за пределы окна. Остальные два параметра обеспечивают (х, у) координаты мыши относительно левого верхнего угла рабочей области окна.
Определение перемещения мыши
GLUT нам возможность обнаружения движения мыши для нашего приложения. Есть два типа движения для GLUT: активные и пассивные движения. Активное движение происходит при перемещении мыши и нажатия кнопки. Пассивные движения, когда мышь движется, но ни одна кнопка не нажата. Если приложение отслеживает движение манипулятора, будет сгенерировано событие в кадре во время периода, когда мышь движется.
Как обычно, вы должны зарегистрироваться GLUT функцию, которая будет отвечать за обработку событий движения. GLUT позволяет определить две различные функции: одна для отслеживания пассивных движений, а другая, чтобы отслеживать активные движения.
Синтаксис GLUT функций слежения за перемещением:
*func - функция, которая будет отвечать за соответствующий тип движения.
Параметры функции обработки движения мыши являются (х, у) декартовы координаты курсора мыши относительно левого верхнего угла рабочей области окна.
Обнаружение попадания или выхода из рабочей области окна курсора мыши
GLUT должен определять, когда мышь покидает или входит в рабочую область окна. Мы зарегестрируем функцию обратного вызова для обработки этих двух событий. GLUT функцией регистрации является обратный вызов glutEntryFunc и синтаксис выглядит следующим образом:
*func - функция, которая будет обрабатывать эти события.
Параметр функции, которая будет обрабатывать эти события сообщает нам, если мышь попадает в левую область окна. GLUT определяет две константы, которые можно использовать в приложении:
Управление камерой с использованием мыши
Когда пользователь нажимает левую кнопку мыши, мы собираемся записать X-координату положения мыши. При перемещении мыши будет проверяться новая позиция по X, и на основе разницы мы установим переменную deltaAngle. Эта переменная будет добавлена в начальный угол для вычислиления направления камеры. Переменная для хранения позиции, где происходит щелчёк мыши по координате X также нам потребуется.
Следует отметить, что xOrigin инициализируется в отрицательное значение, которое никогда не происходит, когда нажата кнопка мыши (она должна быть по меньшей мере равна нулю). Это позволит нам отличить, если пользователь нажимает на левую кнопку или любую другую кнопку.
Следующая функция отвечает за обработку изменения состояния кнопки:
Обратите внимание, что переменная xOrigin имеет значение -1, если кнопка зажата.
Функцию для обработки движения мыши:
В функции main() мы должны зарегистрировать две новые функции обратного вызова:
Итоговый код приложения:
Мы должны получить окно со сценой снеговиков и клавиши перемещения по сцене должны работать совместно. Повороты должны работать с помощью мыши. Тестовый файл прикреплён.
Как сделать форму, через которую можно совершать клики мышью
Возможно ли это вообще? Чтобы ее было видно, но нажатия мышкой проходили сквозь неё) Добавлено.
Как управлять мышью ,а не курсором
Нужно глобально отслеживать и посылать движение и нажатие мыши и клавиатуры,чтобы программа.
Как управлять автомобилем в Battlefield 4 мышью и клавиатурой?
Добрый день! Подскажите, пожалуйста, как управлять автомобилем в battlefield 4? Я имею ввиду, без.
И далее там, где тебе надо вызываешь эту функцию.
С курсором дело ещё легче:
Сначала задаешь точку:
Большое спасибо stalkersev .Неужели всё так просто, когда всё это знаешь !?
А вы случайно не знаете ответ на второй вопрос !?
Как можно получить данные о перемещении курсора мыши и нажатии на ней клавиш ?
Т.е. это мы давали команды мышке, а как наоборот получать эти команды о перемещении и нажатии клавиш ?
Буду очень благодарен . Как можно получить данные о перемещении курсора мыши и нажатии на ней клавиш ?
Поясните вопрос, вам нужно перехватить мышь на самой форме или вООбще?
Если вообще, то вам необходимо копать в сторону winapi -> здесь как раз по вашей теме.
Если нет, то SYD вам уже ответил.
Ребята я вам всем очень благодарен .Простите чайника!
Ещё вопрос!
Студия ругается на [DllImport("user32.dll")] ?
Пишет не хватает директивы using ?
Т.е. надо подключить как то этот файл ?!
Подскажите пожалуйста синтаксис ? Большое спасибо SYD .
Надеюсь выросту когда-нибудь до вашего уровня и тоже буду всем помогать .
Ещё раз спасибо. всё работает .
А с hook-ами буду ещё разбираться .
Может и мне кто подскажет по той же теме?
если использовать WH_MOUSE = 7, то хук нам дает координаты мышки, а если WH_MOUSE = 14, то он нам даст приращение координат, даже если мышка находится на границе Cursor.Clip. Мне позарез нужен как раз второй вариант, но он не везде работает. работает на Windows7, а на WinXP SP3 - не хочет, хотя по идее должен. В чем может быть такой трабл?
Быть может есть другие варианты получить приращение мышиных координат? (даже у края экрана)
private static extern void mouse_event(UInt32 dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, IntPtr dwExtraInfo); dwFlags - это флаг, тут все ясноdx,dy - координаты
а что есть dwData и dwExtraInfo?
поясните, пожалуйста Быть может есть другие варианты получить приращение мышиных координат? А запоминать предыдущие координаты и высчитывать разницу - не вариант?
Клики мышью
Есть возможность в PascalABC совершать клики мышью? например кликнул на правую картинку p:=0;.
Блокировать клики мышью?
Суть. Имеется WF приложение, прозрачная форма (пропускает клики и не сбивает фокус с основного.
Буфер обмена. Клики мышью. Выделение текста
Как при двойном щелчке в браузере или документе (например txt) на номере телефона копировать его в.
Полноценная реакция User Control на клики мышью
Подскажите, пожалуйста, как сделать таким образом: Мною созданный UserControl содержит несколько.
Указатель мыши, который иногда называют курсором, является точечным рисунком, указывающим на экране точку фокуса для ввода данных пользователем с помощью мыши. В этом разделе приводится обзор указателя мыши в Windows Forms и описываются некоторые способы его изменения и управления им.
Доступ к указателю мыши
Указатель мыши представлен классом Cursor, и каждый элемент Control имеет свойство Control.Cursor, которое задает для него указатель. Класс Cursor содержит свойства, описывающие указатель, например свойства Position и HotSpot, а также методы, которые могут изменять внешний вид указателя, например методы Show, Hide и DrawStretched.
В следующем примере курсор скрывается при наведении курсора на кнопку:
Управление указателем мыши
Иногда может потребоваться ограничить область, в которой можно использовать указатель мыши, или изменить расположение мыши. Можно получить или задать текущее расположение мыши с помощью свойства Position объекта Cursor. Кроме того, можно ограничить область, в которой можно использовать указатель мыши, задав свойство Clip. По умолчанию областью действия является весь экран.
В следующем примере указатель мыши помещается между двумя кнопками при их нажатии:
Изменение указателя мыши
Изменение указателя мыши является важным способом предоставления обратной связи пользователю. Например, указатель мыши можно изменить в обработчиках событий MouseEnter и MouseLeave, чтобы сообщить пользователю о том, что выполняются вычисления, и ограничить взаимодействие с пользователем в элементе управления. Иногда указатель мыши изменяется из-за системных событий, например, когда приложение вовлечено в операцию перетаскивания.
Основной способ изменения указателя мыши заключается в присвоении свойству Control.Cursor или DefaultCursor элемента управления нового объекта Cursor. Примеры изменения указателя мыши см. в примере кода в описании класса Cursor. Кроме того, класс Cursors предоставляет набор объектов Cursor для многих различных типов указателей, например указатель в виде руки.
В следующем примере курсор мыши для кнопки меняется на руку:
Чтобы отобразить указатель ожидания в виде песочных часов, когда указатель мыши находится на элементе управления, используйте свойство UseWaitCursor класса Control.
Имитация событий мыши в Windows Forms не так проста, как имитация событий клавиатуры. В Windows Forms отсутствует вспомогательный класс для перемещения мыши и вызова действий щелчка мышью. Единственным вариантом управления мышью является использование собственных методов Windows. При работе с пользовательским элементом управления или формой можно имитировать событие мыши, но нельзя напрямую управлять мышью.
События
У большинства событий есть соответствующий метод, который их вызывает, с шаблонным именем, начинающимся с On , за которым следует EventName , например OnMouseMove . Этот вариант возможен только в пределах пользовательских элементов управления или форм, так как эти методы защищены и недоступны вне контекста элемента управления или формы. Недостаток использования такого метода, как OnMouseMove , заключается в том, что он не управляет мышью или взаимодействует с элементом управления, а просто вызывает связанное событие. Например, если вы хотите имитировать наведение указателя мыши на элемент в ListBox, OnMouseMove и ListBox не будут визуально реагировать на выделенный элемент под курсором.
Эти защищенные методы можно использовать для имитации событий мыши.
- OnMouseDown
- OnMouseEnter
- OnMouseHover
- OnMouseLeave
- OnMouseMove
- OnMouseUp
- OnMouseWheel
- OnMouseClick
- OnMouseDoubleClick
Вызов щелчка мышью
Большинство элементов управления при щелчке мышью выполняют какое-либо действие, например вызов пользовательского кода при нажатии кнопки или изменение состояния флажка после его установки. Поэтому в Windows Forms предусмотрен простой способ запуска действия щелчка мышью. Некоторые элементы управления, такие как ComboBox, не выполняют никаких специальных действий при щелчке мышью, а имитация щелчка не влияет на элемент управления.
PerformClick
Интерфейс System.Windows.Forms.IButtonControl предоставляет метод PerformClick, который имитирует щелчок элемента управления. Этот интерфейс реализуется как элементом управления System.Windows.Forms.Button, так и элементом управления System.Windows.Forms.LinkLabel.
InvokeClick
В форме с пользовательским элементом управления используйте метод InvokeOnClick для имитации щелчка мышью. Это защищенный метод, который может вызываться только в форме или в производном пользовательском элементе управления.
Например, ниже представлен код установки флажка в button1 .
Использование собственных методов Windows
Windows предоставляет методы, которые можно вызывать для имитации движений мыши и щелчков мышью, такие как User32.dll SendInput и User32.dll SetCursorPos . В следующем примере курсор мыши перемещается в центр элемента управления:
Мышь используется преимущественно в тех приложениях, которые предназначены для рисования, например Paint или CorelDRAW. Сделаем подобное, но только более примитивное приложение, в котором пользователь сможет рисовать линии заданного цвета и размера. Использовать будем, также как и в прошлых уроках Visual C++ и библиотеку классов MFC.
Не буду подробно расписывать план создания каркаса приложения, так как Вы знаете шаги этой процедуры из первого урока.
- создаем «Приложение MFC» с названием Pencil;
- во вкладке «Тип приложения» укажите «На основе диалоговых окон» и уберите галку с «Использовать библиотеки с поддержкой Юникода»;
- в следующей вкладке выберете название своего диалогового окна (у меня «Pencil programm»). Остальное оставьте без изменений.
Теперь поместите в окно элементы Static Text и Button, так как это показано на рисунке.
В свойствах объекта Static Text укажите ID «IDC_INSTRUCTION_STATIC», а у Button «IDC_EXIT_BUTTON». Можете, также изменить границы у Static Text, что необязательно.
Щелкните два раза по кнопке «Выход», добавьте функцию OnOK(); в тело функции OnBnClickedExitButton(). Это необходимо для того, чтобы кнопка работала в соответствии с надписью на ней.
В открывшемся окне измените тело функции OnMouseMove на следующий текст и сохраните все изменения.
void CPencilDlg :: OnMouseMove ( UINT nFlags, CPoint point )<
if ( ( nFlags & MK_LBUTTON ) == MK_LBUTTON )
<
CClientDC dc ( this ) ;
dc. SetPixel ( point. x , point. y , RGB ( 0 , 0 , 255 ) ) ;
>
CDialogEx :: OnMouseMove ( nFlags, point ) ; //присутствует по умолчанию
>
- оператор if проверяет, зажата и перемещается ли левая кнопка мыши, если да то выводиться точка за точкой;
- dc(this) — экземпляр класса CClientDC, с помощью экземпляра класса вы можете обращаться к функциям этого класса.
- dc.SetPixel(); — рисует точки, координаты которых ему передают операторы point.x и point.y, а RGB() задает цвет.
Запустив программу, можно имитировать ручку или карандаш указателем мыши.
Во всяком случае, надпись или картинка нарисованная таким способом выглядит не слишком привлекательно. Поэтому сделаем линии непрерывными (соединим точки). Для этого нам необходимо следующее:
-
Объявим целочисленные переменные m_PointX и m_PointY для хранения предыдущих координат мыши.
Воспользовавшись обозревателем решений, откроем файл PencilDlg.h. Впишем следующий код.
<
// Создание
public :
CPencilDlg ( CWnd * pParent = NULL ) ; // стандартный конструктор (присутствует по умолчанию)
int m_PointX ; //добавляем
int m_PointY ; //добавляем
> ; void CPencilDlg :: OnMouseMove ( UINT nFlags, CPoint point )
<
if ( ( nFlags & MK_LBUTTON ) == MK_LBUTTON )
<
CClientDC dc ( this ) ;
CPen NewPen ( PS_SOLID, 5 , RGB ( 0 , 0 , 255 ) ) ;
dc. SelectObject ( & NewPen ) ;
dc. MoveTo ( m_PointX, m_PointY ) ;
dc. LineTo ( point. x , point. y ) ;
m_PointX = point. x ;
m_PointY = point. y ;
>
CDialogEx :: OnMouseMove ( nFlags, point ) ; //присутствует по умолчанию
>
- Функция CPen NewPen(PS_SOLID, 5, RGB(0,0,255)); создает новое перо синего цвета и размером шрифта в 5 пикселей. Параметр PS_SOLID указывает на рисование сплошной линии;
- В SelectObject передается адрес нового пера, после чего оно включается в работу;
- dc.MoveTo(m_PointX, m_PointY) и dc.LineTo(point.x, point.y) рисуют линию, используя координаты начала и конца;
- Последние два оператора сохраняют в переменных m_PointX и m_PointY текущие координаты;
Изменим тело этой функции:
void CPencilDlg :: OnLButtonDown ( UINT nFlags, CPoint point )<
m_PointX = point. x ;
m_PointY = point. y ;
CDialogEx :: OnLButtonDown ( nFlags, point ) ;
>
Только что мы обновили значения переменных m_PointX и m_PointY тем местоположением, где было совершено нажатие левой кнопки мыши. Теперь ваша программа будет работать не хуже графических редакторов 80-ых годов)) Файлы исходного кода доступны для скачивания по этой ссылке.
Читайте также: