Jeffrey Watkins Ответов: 1

Добавление аргументов события мыши для класса


Хорошо я построил класс который производит прямоугольники
30 из них в 3 группы по 10 человек.

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

пример:
Dim betline1 As New TicketGroupNodeControl

           betline1.NewNumericUpAndDownXValue() = NumericUpDown1.Value
           betline1.NewNumericUpAndDownYValue() = NumericUpDown2.Value
           betline1.NewNumericUpAndDownXXValue() = NumericUpDown3.Value
           betline1.NewNumericUpAndDownYYValue() = NumericUpDown4.Value

           betline1.FibTrainerOhioPk3BetLineNodeGroup()

           For i = 0 To betline1.BetLineNodeGroup.Length - 1
               e.Graphics.DrawRectangle(Pens.Blue, betline1.BetLineNodeGroup(i))
               e.Graphics.FillRectangle(Brushes.Blue, betline1.BetLineNodeGroup(i))

           Next i


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

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

Что я уже пробовал:

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

Возможно, у меня будет 100 таких копий для разных установок .
но только скажем, что 10 установок будут активны в любой момент времени.


Private Sub RadDiagram1_MouseMove(sender As Object, e As MouseEventArgs) Handles RadDiagram1.MouseMove
       Label1.Text = "X:" & e.X.ToString & "     " & "Y:" & e.Y.ToString

       'If e.Button = Windows.Forms.MouseButtons.Left AndAlso betConfig1.BetConfigNodeGroup(0).Contains(e.Location) Then
       '    NumericUpDown21.Value = e.X + x
       '    NumericUpDown22.Value = e.Y + y
       '    RadDiagram1.Invalidate()
       'End If



Private Sub RadDiagram1_MouseDown(sender As Object, e As MouseEventArgs) Handles RadDiagram1.MouseDown
       'If e.Button = Windows.Forms.MouseButtons.Left AndAlso betConfig1.BetConfigNodeGroup(0).Contains(e.Location) Then
       '    x = NumericUpDown21.Value - e.X
       '    y = NumericUpDown21.Value - e.Y
       'End If
   End Sub


Если я сделаю betconfig1 глобальным, это сработает.

Как я могу добавить его в класс или, возможно, добавить какой-то обработчик?

Может ли кто-нибудь привести мне пример того, как я все еще могу вызвать аргумент мыши из мгновения класса, который я создаю в процедуре paint picturebox1 или " raddiagram 1"

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

Любая помощь будет оценена по достоинству.
Я полностью самоучка и просто не знаю, в какую сторону идти, чтобы найти выход из этой проблемы.

Спасибо Джефф

1 Ответов

Рейтинг:
7

OriginalGriff

Это зависит от того, где вы запускаете событие мыши - если оно является частью TicketGroupNodeControl, то экземпляр элемента управления, который вызвал это событие, передается вам в sender параметр обработчика событий-все, что вам нужно сделать, это привести его к соответствующему типу и использовать.
Если это не так, то будет предоставлен элемент управления, над которым была наведена мышь при нажатии кнопки - так что если ваш групповой элемент управления содержит элементы управления, которые вы ищете в комментариях, то он уже доступен через sender параметр.

Используйте отладчик и посмотрите на параметр - он может помочь вам понять, что происходит.


не совсем понимаю, о чем вы там говорите ?
Я использую класс и создаю экземпляр этого класса в стороне от процедуры paint picturebox1 say.

Это в краске

Dim betline1 As New TicketGroupNodeControl


Затем после того, как я нарисовал 30 прямоугольников .

Я хочу использовать событие mousedown и событие mousemove
чтобы проверить, находится ли указатель мыши в первом прямоугольнике. contains (e. location) при нажатии левой кнопки мыши .
Если это так, перетащите квадрат, а затем обновите его местоположение при освобождении.

Но когда я использую args события мыши.
betline1. переменная или экземпляр недопустимы в этой области. потому что он был создан в paint sub.

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



Ладно...нам придется вернуться на пару шагов назад, потому что то, что вы пытаетесь сделать, неправильно!

Во-первых, вы не должны создавать свои объекты в обработчике событий Paint по двум причинам:
1) он должен быть как можно более коротким и "быстрым", иначе это плохо повлияет на ваш пользовательский интерфейс.
2) краска-это событие "часто летающих пассажиров" - оно срабатывает много: каждый раз, когда система должна показать пользователю изменение.

Это означает, что ваши объекты для отображения не должны создаваться в событии Paint - они должны быть готовы к обработке события Paint. Подумайте об этом: когда вы "перетаскиваете" один из ваших квадратов, вам нужно обработать событие paint, чтобы показать его движение! :смеяться:

Поэтому начните с создания ваших квадратов в контейнере для ваших квадратов (возможно, ваша форма, но я бы сам использовал UserControl - не беспокойтесь об этом, вы придете к ним позже).
Ваши квадраты должны быть доступны как внутри события Paint (чтобы их можно было нарисовать), так и внутри других событий - MouseDown и MouseMove тоже нуждаются в них - иначе они не смогут работать вместе, чтобы перемещать и отображать ваши элементы.
Поэтому создайте свои квадраты как часть содержащего класса-возможно, формы-и используйте их в обработчиках. Посмотрите на добавление квадратов как часть формы.Показанное событие и вызов недействительны, когда вы хотите обновить дисплей.
Есть ли в этом смысл?


OriginalGriff

Итак, вы ищете прямоугольники, которые должны быть нарисованы на PictureBox в PB.Событие краски?
Если это так, то я бы добавил список фигур и установил PictureBox.Тег свойство к этому списку. Каждый элемент управления имеет свойство тега, которое существует для того, чтобы вы "ассоциировали" информацию с этим конкретным экземпляром элемента управления. Таким образом, вы можете иметь два элемента управления PictureBox, каждый с отдельными списками фигур, которые они должны нарисовать в событии paint.
Есть ли в этом смысл?

OriginalGriff

Ответ обновлен - мне нужно было пространство! :смеяться:

Jeffrey Watkins

Хорошо, позвольте мне попытаться объяснить это лучше.

У меня есть класс, который имеет свойства и метод для рисования 30
прямоугольники все в группе, которые могут быть перемещены x & Y также могут равномерно расширяться друг от друга x & Y

Они находятся в массиве прямоугольников () от 0 до 29.

Когда я создаю экземпляр этого объекта из своего класса rectangle
"Dim betline1 как новый TicketGroupNodeControl"

betline1.NewNumericUpAndDownXValue() = NumericUpDown1.Значение
betline1.NewNumericUpAndDownYValue() = NumericUpDown2.Значение
betline1.NewNumericUpAndDownXXValue() = NumericUpDown3.Значение
betline1.NewNumericUpAndDownYYValue() = NumericUpDown4.Значение

betline1.FibTrainerOhioPk3BetLineNodeGroup()

Для i = 0 до betline1.BetLineNodeGroup.Длина - 1
е.Графика.Объекта Drawrectangle(Ручки.Синий, betline1.BetLineNodeGroup(я))
е.Графика.FillRectangle (Кисти.Синий, betline1.BetLineNodeGroup(я))

Далее я
Все это должно быть в краске.
потому что это локальная переменная

единственный вариант, который у меня есть, - это просто создать глобальные переменные для каждого экземпляра, которые заставят меня уже объявить 100 переменных экземпляра.
это в зависимости от настроек пользователя может быть выбрано или Не выбрано.

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

После того, как все прямоугольники будут установлены на свое место.
эти места будут записаны и сохранены .

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

Также это делается для оформления макета билета.
есть как минимум 7 групп по 30 человек на билет.
в зависимости от макета билета, какие группы будут вызваны к конструктору..

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

есть ли в этом смысл?

OriginalGriff

Правильно... Кажется, я понял.
Я бы сделал это так: создал UserControl, который содержит и рисует прямоугольники. Это не имеет никакого отношения к форме - это ваш NewTicketGroupNodeControl, и он рисует прямоугольники в своем событии Paint, они не рисуются в событии containers Paint.
Когда свойства, которые вы показываете, изменяются, это приводит к тому, что элемент управления становится недействительным, что заставляет его перерисовываться.
Экземпляр UserControl отбрасывается на поверхность формы (или другого контейнера), а не создается в Form.Paint, как и все остальные элементы управления. В противном случае каждый раз, когда вы перемещаете главное окно или перетаскиваете другое приложение поверх него, Windows вызывает обработчик событий Paint, который каждый раз создает новые экземпляры. Вы не хотите этого, как не хотите создавать новый экземпляр кнопки или текстового поля каждый раз, когда Windows нуждается в том, чтобы вы перекрасили свой пользовательский интерфейс!
UserControl обрабатывает события MouseDown и MouseMove для перемещения внутри своего контейнера - ему не нужно беспокоиться о прямоугольниках, потому что они автоматически рисуются с помощью события Paint, когда это необходимо.

Вам не нужно иметь их в качестве переменных экземпляра в более чем одной группе прямоугольников, так как вы можете просто создать их во время выполнения (с помощью методов Load или showed) и добавить их в коллекцию элементов управления контейнера, которая автоматически генерирует события рисования для каждого из них по мере необходимости. Затем каждый отдельный экземпляр будет обрабатывать события мыши для себя, а не для формы, выполняющей это за них.

Я знаю, что это не то, что у вас есть в данный момент, но это тот путь, которым вы хотите идти.

Jeffrey Watkins

о, хорошо, если я понимаю, что ваш подход будет заключаться в том, чтобы создать пользовательский элемент управления, который является picturebox, и добавить код для него внутри пользовательского элемента управления.
Потому что у него было бы свое собственное событие paint gotcha .
Стоит попробовать .
Я дам этому шанс.

Спасибо за идею

OriginalGriff

Пожалуйста!

Jeffrey Watkins

Это действительно открыло мне дверь "OriginalGriff"
То, что я сделал до сих пор, вместо того, чтобы создать 1 индивидуальный контроль
Я создал целую библиотеку управления.

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

И я использую перечисление в другом классе, основанном на том, что там выбрано.
загрузит показать и скрыть пользовательские элементы управления .
это должно сработать.
Спасибо снова...
Джефф

OriginalGriff

Рад это слышать! :большой палец вверх: