Автор вопроса: supaplex777 | Web-сайт:dudkino-net.tut.su | ICQ: 397711309
Пытался, пытался я добавить пример программы на главную страницу сайта - нихрена не получилось! Ну ладно. Есть же форум для этого! Я не буду мудрить а просто скопирую текст письма к user@vbnet.ru сюда.
Всегда, когда делаешь что то сам, чувствуется, как ограничивает нас ГУЙ. Т.к. на данный момент ничего лучше него не придумали, приходится улучшать то что есть. Интерфейс программы это на самом деле не последняя вещь в программировании. Я думаю, что многие проблемы с использованием тех или иных программ возникают у пользователей всвязи с необходимостью щёлкать мышью. При нажатии на клавишу мыши напрягаются группы мышц, не использующиеся при перемещении манипулятора. Таким образом, вся работа пользователя состоит из циклов перемещение-щелчок. Думаю что это если не утомляет, то просто подсознательно надоедает пользователю. Особенно раздражает необходимость выполнять операции совершенно разного рода всё теми же щелчками. Я думаю, что выпадение раскрывающегося списка, например, будет и лучше выглядеть, и выполняться намного удобнее с помощью кругового движения курсором. Сами принципы распознавания центра окружности реализованы и готовы к дальнейшей обработке в этом примере.
К сожалению быстродействие VB (либо быстродействие моего Celeron'а) позволяет распознавать окружности только с небольшим (~300 пикс.) диаметром. Думаю, реализация моей идеи на другом, более быстром языке решит эту проблему. Все проблемы с таким новшеством в Вашей программе должны быть оправданы. Только представьте: Вы обводите курсором пункт меню, и оно выпадает вниз! Это должно быть красиво! Возможно создание внешней программы, которая с помощью Win API определяла бы верхнее окно и посылала бы WM-сообщение нужной кнопочке любой программы.
Итак, требуется только форма Form1 (я нашёл в закромах чёрную с зелёным цветом рисования) с таймером Timer1 (я имел на руках хороший совковый таймер с интервалом в 1,5 секунды) и один модуль.
***НАЧАЛО_ФОРМЫ***
Dim m() As point, up As Long, msize As Long, c As point, e As Boolean
'Если у Вас есть Notepad++ то смотрите комментарии к коду в нём при включенном синтаксисе VB - намного удобней чем в самом VB!
'Если у вас его нет - быстрей качайте! подсветка множества синтаксисов! Очень удобно!
Private Sub Form_Load()
If Form1.ScaleWidth < Form1.ScaleHeight Then msize = Form1.ScaleWidth Else msize = Form1.ScaleHeight
up = Int(3.1415926 * msize)
ReDim m(up)
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If e Then Exit Sub
Form1.PSet (m(up).X, m(up).Y), vbBlack '''''''''все дейстия отмеченные множеством апострофов не нужны и должн быть удалены после отладки вашей программы
For j = up To j = 1 Step -1
If j < 1 Then Exit For
m(j) = m(j - 1)
Next j 'в этом цикле мы затираем верхнюю точку массива и поднимаем на единицу все остальные освобождая место для фиксации новой точки
m(0).X = X
m(0).Y = Y 'зафиксировали новую точку
Form_Paint ''''''''''теперь прорисуем все зафиксированные точки чтобы видеть прогресс
For j = 30 To up 'цикл начинается с 30 чтобы "нижняя" (нулевая) точка массива не давала ложных вызовов по отношению к своим "соседкам по этажу"
If compare(m(0), m(j)) Then 'мы предсавляем себе, будто наша нижняя точка это "конец буквы С" и каждый раз пытаемся найти ей достаточно близкое "начало"
pst m(0), vbRed ''''''''''''''
pst m(j), vbRed ''''''''''''''
c.X = 0
c.Y = 0 'в эту переменную мы найдём центр окружности
k = Int(j / 2) 'а тут пусть будет пол-круга чтобы каждый раз его не считать и не напрягать машину
For i = 0 To k
c.X = c.X + (m(i).X + m(i + k).X) / 2
c.Y = c.Y + (m(i).Y + m(i + k).Y) / 2 '(m(i) + m(i + k)) / 2 это "средняя" точка между противолежащими(m(i) и m(i + k)) точками окружности должна указывать на центр (только жалко что нельзя так сделать с самодельным типом данных - приходится дробить на x и y всегда)
Next i
c.X = c.X / k
c.Y = c.Y / k 'это мы нашли среднее арифметическое всех вероятных центров окружности, таким образом, получая достаточно достоверный центр
r = 0
For i = 0 To j
r = r + rasst(c, m(i)) 'rasst(c, m(i)) расстояние от точки до центра - здесь должен получиться радиус окружности
Next i
r = r / j 'находим среднее арифметическое всех радиусов опять же получая наиболее достоверный
o = 0
For i = 0 To j
If (rasst(c, m(i)) - r) / msize > 0.1 Then o = o + 1 'здесь мы считаем как много точек вылетело ну уж совсем за пределы круга (лишние срабатывания страшнее чем кажутся)
Next i
If o / j < 0.05 Then ' если точек-путешественниц не так уж и много то можно совершить действие (в данном случае только демонстрация)
Form1.Circle (c.X, c.Y), r, vbRed '''''''''''
Form1.Line (c.X - 1, c.Y)-(c.X + 1, c.Y) '''''''''''
Form1.Line (c.X, c.Y - 1)-(c.X, c.Y + 1) '''''''''''
e = True
Timer1.Enabled = True
End If
End If
Next j
End Sub
Private Sub Form_Paint()
For j = 0 To up
Form1.PSet (m(j).X, m(j).Y) 'Просто отмечаем каждую зафиксированную точку
Next j
End Sub
Private Function compare(t1 As point, t2 As point) As Boolean 'функция позволяет быть уверенным что точки ПРИБЛИЗИТЕЛЬНО совпадают
compare = CBool(rasst(t1, t2) / msize <= 0.1)
End Function
Private Sub pst(p As point, color As Long) 'функция введена для удобства
Form1.PSet (p.X, p.Y), color
End Sub
Private Function rasst(t1 As point, t2 As point) As Long 'функция геометрически вычисляет расстояние между точками
rasst = Sqr((t2.X - t1.X) * (t2.X - t1.X) + (t2.Y - t1.Y) * (t2.Y - t1.Y))
End Function
Private Sub Timer1_Timer() 'этот таймер и переменная e введены чтобы прекратить "рисование" кругами. В практической реализации они не нужны
e = False
Timer1.Enabled = False
End Sub
***КОНЕЦ_ФОРМЫ***
***НАЧАЛО_МОДУЛЯ***
Public Type point
X As Long
Y As Long
End Type
***КОНЕЦ_МОДУЛЯ***
Да нее, ты не понял суть. Вот, допустим, все ведь видели как сворачивается Win Mediaplayer в панель задач. Вот там очень неудобен регулятор громкости. А мы, допустим, сворачиваем свой плеер также, в панель задач. Так вот мы можем сделать так что при круговом обводе значка динамика появляется регулятор громкости и мы не сбавляя скорости курсора регулируем громкость, при нажатии левой кнопки мыши открывается регулятор баланса право-лево, при нажатии на колесо откроется эквалайзер, а при нажатии правой кнопки мыши ну допустим поведение громкости при запуске сторонних приложений.
Фактически получается четвёртая кнопка мыши. При этом, удобно что курсор не должен терять скорости. Просто я вот хочу увидеть реакцию народа на эту пусть не новую идею. Ну и пусть что есть уже прога такая. Наша задача это, как всегда, доказать что можно сделать это же и на VB.
За то время пока ты нарисуешь круг диаметром 300 пикселей я успею изменить громкость, переключить трек, получить почту и пощелкать по ссылкам в браузере
Другое дело - люди с ограниченными возможностями, у них, возможно, будет востребовано, правда пока плохо представляю как, но направление, как мне кажется, верное.