Member 12815488 Ответов: 1

Событие мыши между классами


у меня есть довольно простое событие mousemove, которое просто показывает положение мыши X,Y на изображении picturebox

** класс обработки изображений
public void move(MouseEventArgs e)
        {
            double x = e.X - xOffset;
            double y = e.Y - yOffset;
            double worldx, worldy;
            worldx = DPM.xlo + (x-DPM.hll)*(DPM.xhi-DPM.xlo)/(DPM.hur-DPM.hll);
            worldy = DPM.ylo + (y-DPM.vll)*(DPM.yhi-DPM.ylo)/(DPM.vur-DPM.vll);
            f1.labX.Text = worldx.ToString("F");
            f1.labY.Text = worldy.ToString("F");
        }

я пытаюсь переместить все свои изменения изображений в класс изображений, но вызов mousemove из основного класса не работает - я думаю, это потому, что каждый раз, когда я создаю экземпляр класса, я обновляю переменные (и я использую xOffset и yOffset, которые являются последней известной позицией курсора). У меня также есть некоторые вещи, основанные на кликах, и они прекрасно работают, что подтверждает мои подозрения, я думаю.

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

если я сохраняю код в основной форме, все работает нормально, так что я знаю, что основной материал в порядке

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

**в основном классе форм
private void evImage_MouseMove(object sender, MouseEventArgs e)
        {
            EvImage ev1 = new EvImage(this);
            ev1.move(e);
        }

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

public EvImage ev;
        public Form1(EvImage form)
        {
            this.ev = form;
        }

private void evImage_MouseMove(object sender, MouseEventArgs e)
        {           
            ev.move(e);
        }

я думал, что это даст мне один экземпляр, но он не будет компилироваться

1 Ответов

Рейтинг:
12

Mehedi Shams

Привет член 12815488, некоторые из ваших кодов сбивают с толку. Я думаю, что ваше имя класса EvImage где находится весь код обработки изображений? Впрочем evImage_MouseMove() похоже, ваше имя формы evImage, но ваше имя формы на самом деле Form1.

Пожалуйста, попробуйте выполнить следующие действия в основной форме. Этот код основан на предположении, что имя вашей формы Form1, ваше имя класса EvImage:

EvImage ev1;
private void Form1_Load(object sender, EventArgs e)
{
    ev1 = new EvImage(this);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    ev1.move(e);
}
То, что здесь делается, - это EvImage класс создается только один раз.


Member 12815488

извините за это, но вы правы насчет занятий. моя "другая" проблема заключается в том, что я не могу создать экземпляр класса EvImage вне метода, потому что этот класс имеет конструктор, который принимает класс Form1 (это единственный способ, которым я знаю, как создать экземпляр формы для доступа ко всем текстовым полям и т. д.)
публичный EvImage(Форма 1 форма)
{
this. f1 = форма
}
и из-за этого конструктора я не могу понять, как создать экземпляр вне метода с помощью EvImage(это)

Mehedi Shams

Привет Член 12815488,

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

Member 12815488

Спасибо! я никогда не думал о том, чтобы поместить его в форму Load (), элегантную и великолепную.

Mehedi Shams

Рад помочь. Ура :)!