0 / 0 / 0
Регистрация: 21.05.2014
Сообщений: 18

Построение графиков и считывание координат расположения курсора

22.06.2014, 01:40. Показов 2683. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, допустим у меня есть некий график построенный. Я вожу курсором по этому графику и при нажатии на кнопку мыши необходимо чтоб считались координаты x и y. Подскажите что почитать, возможно есть примеры реализации. Я вот никак не знаю откуда подступиться!

Добавлено через 8 минут
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
   Imports System
                            Imports System.Windows.Forms
                            Imports System.Drawing
 
                            Class FunWithTheMouse
                            Inherits Form
 
                            ' Объявляем объекты, к которым будем обращаться из разных методов
                            Private pictureBox1 As PictureBox
                            Private label1 As Label
                            Private spotClicked As Point
 
                            ' Метод-конструктор нашего класса
                            Public  Sub New()
 
                            ' Задаем размеры окна
                            Me.Size = New Size(640, 480)
 
                            ' Загружаем фотографию в элемент PictureBox и добавляем его на форму
                            pictureBox1 = New PictureBox()
                            pictureBox1.Image = DirectCast(New Bitmap("../../images/foal.jpg"), Image)
                            pictureBox1.SizeMode = PictureBoxSizeMode.Normal
                            pictureBox1.Dock = DockStyle.Fill
                            Me.Controls.Add(pictureBox1)
 
                            ' Добавляем метку с инструкциями в нижнюю часть экрана
                            label1 = New Label()
                            label1.BackColor = Color.Wheat
                            label1.Dock = DockStyle.Bottom
                            label1.Text = "Drag rectangle with left mouse button (draw) or another " _
                            & "mouse button (lighten). To scribble, hold SHIFT and move mouse."
                            label1.TextAlign = ContentAlignment.MiddleCenter
                            Me.Controls.Add(label1)
 
                            ' Привязываем PictureBox к обработчикам событий мыши
                            AddHandler Me.pictureBox1.MouseDown, AddressOf MouseButtonIsDown
                            AddHandler Me.pictureBox1.MouseUp, AddressOf MouseButtonIsUp
                            AddHandler Me.pictureBox1.MouseMove, AddressOf TheMouseMoved
                            End Sub
 
                            ' Обработчик событий, срабатывающий при ПЕРЕМЕЩЕНИИ мыши
                            Public Sub TheMouseMoved(ByVal sender As Object, ByVal e As MouseEventArgs)
 
                            ' Если на клавиатуре нажата клавиша SHIFT
                            If (Control.ModifierKeys And Keys.Shift) = Keys.Shift Then
 
                            ' Подготовка области рисования на изображении
                            Dim g As System.Drawing.Graphics = Me.pictureBox1.CreateGraphics()
 
                            ' Используем желтое перо
                            Dim yellowPen As System.Drawing.Pen = _
                            New System.Drawing.Pen(Color.Yellow, 3)
 
                            ' Рисование окружности (эллипс, вписанный в квадрат)
                            ' Верхний левый угол квадрата имеет координаты X и Y текущего положения мыши
                            g.DrawEllipse(yellowPen, e.X, e.Y, 40, 40)
 
                            ' Очистка
                            g.Dispose()
                            End If
                            End Sub
 
                            ' Обработчик событий, срабатывающий при НАЖАТИИ кнопки мыши
                            Public Sub MouseButtonIsDown(ByVal sender As Object, ByVal e As MouseEventArgs)
 
                            ' Запоминаем точку, в которой произошло нажатие кнопки мыши. Когда
                            ' кнопка будет отпущена, нам понадобятся ее координаты
 
                            spotClicked.X = e.X ' горизонтальная координата
                            spotClicked.Y = e.Y ' вертикальная кордината
                            End Sub
 
                            ' Обработчик событий, срабатывающий при ОТЖАТИИ кнопки мыши
                            Public Sub MouseButtonIsUp(ByVal sender As Object, ByVal e As MouseEventArgs)
 
                            ' Пользователь отпустил кнопку мыши!
 
                            ' Создаем прямоугольник (пока он еще не виден), ограничивающий
                            ' область изображения, с которой пользователь будет работать
                            Dim r As Rectangle = New Rectangle()
 
                            ' Левый верхний угол соответствует точке, в которой была нажата кнопка мыши
                            ' Мы сохранили ее координаты с помощью описанного выше метода
                            r.X = spotClicked.X
                            r.Y = spotClicked.Y
 
                            ' Ширина и высота прямоугольника вычисляется
                            ' путем вычитания начальных координат мыши (в точке нажатия)
                            ' из текущих координат (в точке отжатия кнопки)
                            r.Width = e.X - spotClicked.X
                            r.Height = e.Y - spotClicked.Y
 
                            If e.Button = Windows.Forms.MouseButtons.Left Then
                            ' Если была нажата и отпущена левая кнопка мыши
                            ' рисуем видимый контур прямоугольника
 
                            ' Подготовка области рисования на изображении
                            Dim g As Graphics = Me.pictureBox1.CreateGraphics()
 
                            ' Рисуем красный контур прямоугольника
                            Dim redPen As Pen = New Pen(Color.Red, 2)
                            g.DrawRectangle(redPen, r)
                            Else
 
                            '  Если была нажата другая кнопка, вызываем более сложный
                            '  метод, подсвечивающий область изображения
                            ChangeLightness(r)
                            End If
                            End Sub
 
                            ' Метод, увеличивающий яркость выбранного участка изображения
                            ' путем увеличения яркости каждого пикселя этого участка
                            Public Sub ChangeLightness(ByVal rect As Rectangle)
 
                            Dim newRed As Integer, newGreen As Integer, newBlue As Integer
                            Dim pixel As Color
 
                            ' Копируем изображение, загруженное в PictureBox
                            Dim picture As System.Drawing.Bitmap = New Bitmap(Me.pictureBox1.Image)
 
                            ' Поскольку операция увеличения яркости может занять много времени,
                            ' необходимо предупредить об этом пользователя, если выбран большой участок
                            If (rect.Width > 150) OrElse (rect.Height > 150) Then
                            Dim result As DialogResult = MessageBox.Show( _
                            "The area you selected is large and may take " _
                            & " a long time to lighten", _
                            "Warning", _
                            MessageBoxButtons.OKCancel)
 
                            ' При нажатии кнопки Cancel (Отмена) выходим из метода
                            ' и возвращаемся к месту его вызова
                            If result = Windows.Forms.DialogResult.Cancel Then
                            Return
                            End If
                            End If
 
                            ' Перебираем последовательно все пиксели данного участка
                            ' и удваиваем значение яркости компонент RGB пикселей
 
                            ' Перебор по горизонтали слева направо ...
                            For x As Integer = rect.X To rect.X + rect.Width - 1
 
                            ' и по вертикали сверху вниз ...
                            For y As Integer = rect.Y To (rect.Y + rect.Height) - 1
 
                            ' Считываем текущий пиксель
                            pixel = picture.GetPixel(x, y)
 
                            ' Увеличиваем яркость цветовых компонент пикселя
                            newRed = Convert.ToInt32(Math.Round(pixel.R * 2, 0))
                            If newRed > 255 Then
                            newRed = 255
                            End If
                            newGreen = Convert.ToInt32(Math.Round(pixel.G * 2, 0))
                            If newGreen > 255 Then
                            newGreen = 255
                            End If
                            newBlue = Convert.ToInt32(Math.Round(pixel.B * 2, 0))
                            If newBlue > 255 Then
                            newBlue = 255
                            End If
 
                            ' Присваиваем пикселю новые цветовые значения
                            picture.SetPixel(x, y, _
                            Color.FromArgb(Convert.ToByte(newRed), _
                            Convert.ToByte(newGreen), _
                            Convert.ToByte(newBlue)))
                            Next
                            Next
 
                            ' Помещаем измененную копию изображения в PictureBox
                            ' чтобы изменения отобразились на экране
                            Me.pictureBox1.Image = picture
                            End Sub
 
                            Shared Sub Main()
                            ' Создаем экземпляр класса формы
                            Application.Run(New FunWithTheMouse())
                            End Sub
 
                            End Class
"Компьютер может отслеживать положение курсора мыши, определяемое координатами X и Y (горизонтальная и вертикальная координаты). Так, верхний левый угол экрана имеет координаты X=0 и Y=0."
Вот нашел на сайте микросовта, только как я понял положение курсора 0 0 это в зависимости от монитора, а не от программы. То есть если я буду работать при разных расширениях то получу разный результат! и ещё от положения окна программы!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.06.2014, 01:40
Ответы с готовыми решениями:

Считывание координат (x;y) курсора мышки
Всем доброго время препровождения Есть необходимость считать ось "y" курсора По алгоритму типа: Если зажата СКМ и значение оси...

Считывание координат курсора над формой
Доброго дня. Имеется форма с двумя текстбоксами. Требуется выводить обе координаты курсора в них, если курсор движется над формой. ...

Считывание координат курсора при нажатии ЛКМ
Здравствуйте. Пишу небольшой автокликер. Столкнулся с проблемой, нужно считать координаты курсора, как и в любом кликере. Вот что...

14
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
22.06.2014, 02:23
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

kkdamirkk, абстрагируясь от Вашего кода я приведу пример, как вычислить координаты курсора относительно определенного объекта, например, формы

VB.NET
1
2
3
    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
        Me.Text = e.Location.ToString
    End Sub
Как видно из примера, координаты вычисляются относительно формы, ее размер и разрешение экрана во внимание не берется.

Аналогично с другими объектами, например, PictureBox.

Просьба обратить внимание на сигнатуру метода, ибо Form1_MouseClick и Form1_Click - это далеко не одно и то же (на всякий случай)
0
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
27.07.2014, 20:42
Памирыч, аналогичная проблема! попробовал как вы пишет ошибку "Location" не является членом "System.Windows.Forms.MouseEventArgs ".
0
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
27.07.2014, 21:19
gjboy, покажите этот участок кода
0
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
28.07.2014, 01:14
Памирыч,
VB.NET
1
2
3
Private Sub PictureBox1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    Me.Text = e.Location.ToString
End Sub
Скопировал в надежде что заработает! но нет))

А вообще я сделал вот так
VB.NET
1
2
3
4
5
6
7
8
9
 Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        TextBox3.Text = TextBox1.Text
        TextBox4.Text = TextBox2.Text
    End Sub
 
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        TextBox1.Text = MousePosition.X
        TextBox2.Text = MousePosition.Y
    End Sub
Но блин такой вариант ищет координату относительно монитора! и смещая форму координаты меняются! как мне сделать чтоб относительно формы хотя бы или в идеале относительно picturebox? пример создателя поста крайне непонятен!
0
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.07.2014, 06:15
Private Sub PictureBox1_MouseClick(ByVal ...gs) Handles Me.MouseClick
В первом куске кода у Вас нестыковки. На самом деле событие работает на клики по форме

По поводу второго. Я же писал, что надо использовать e.
MousePosition естественно вычисляет координаты относительно монитора.
Нужно так

VB.NET
1
2
3
4
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        TextBox1.Text = e.Location.X
        TextBox2.Text = e.Location.Y
    End Sub
0
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
28.07.2014, 13:01
Памирыч, сделал как вы говорите, опять ошибка. Такая же как и была
0
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.07.2014, 13:04
Скриншот, чтоли, покажите, ибо странно
0
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
28.07.2014, 13:32


0
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.07.2014, 13:40
У Вас что, Visual Studio 2003?
А какой Framework используется в проекте?
0
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
28.07.2014, 13:47
VB 2003.net
framework1.1
0
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.07.2014, 13:52
Нет такой под рукой, но, может быть в этом и причина.
К сожалению, альтернативы для 1.1 для определения положения курсора я не знаю.

Настоятельно рекомендую использовать что-то поновее, хотя бы 2008 и выше
0
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
28.07.2014, 13:55
Памирыч, vb 2008.net? хорошо, сегодня переставлю! framework тоже переставлять?
0
Почетный модератор
 Аватар для Памирыч
23249 / 9161 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.07.2014, 14:04
gjboy, 2008 или выше. Если у Вас Windows XP, то максимум, что можно поставить - 2010, но у системы должен быть сервиспак 3.
Для Windows 7 можно поставить 2008 и выше (за 2013 не ручаюсь)

Фреймворки установятся вместе со студией сами
1
1 / 1 / 1
Регистрация: 02.07.2014
Сообщений: 41
29.07.2014, 03:02
Памирыч, спасибо большое! поставил VS 2013 ultimate. всё прекрасно работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2014, 03:02
Помогаю со студенческими работами здесь

Построение графиков в декартовой системе координат
Здравствуйте. Недавно начал изучать маткад и сразу появились вопросы. Как можно построить на графике квадрат, а внутри него треугольник? ...

Построение графиков функций в декартовой системе координат.
Здраствуйте!мне нужно решить 2-е задачи по паскаль. Обе нужно сделать до 14.03.2010. Проблема в том,что решение одной из задачи у меня...

Построение графиков функций в различных системах координат
Построить в декартовой и полярной (лепестковая диаграмма) системах координат при Х графики следующих пар функций (по две функции...

Построение графиков функций в полярной системе координат
Составьте программу построения графика функций в полярной системе координат 1. ρ=2(1+cos(φ)) 2. ρ=1+(2cos(φ)-cos(6φ))/3 3. ρ=10sin3φ

Построение нескольких графиков в одной системе координат
Построить графики функций f1(x), f2(x), f2(x) в одной системе координат на интервале . Как построить один график в системе координат я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru