Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6301
Последний выпуск: 19.06.2015

как узнать координаты курсора относительно Graphics если применен метод ScaleTransform?

65K
19 мая 2013 года
yakuleb
7 / / 14.07.2011
Как получить координаты курсора не относительно формы, а относительно поверхности Graphics, выведенной в форму. Нужно учесть, что масштаб выводимого изображения меняется колесиком мыши в методе MouseWheel().

private void panel1_Paint(object sender, PaintEventArgs e)
{
grafika = e.Graphics;
e.Graphics.ScaleTransform(Scale,Scale);
foreach (Rose rose in roses)
rose.Draw(e.Graphics);
}

private void panel1_MouseWheel(object sender, MouseEventArgs e)
{
int scl = e.Delta;
textBox3.Text = scl.ToString();
Scale = Scale + scl/1000.0F;
textBox4.Text = Scale.ToString();
panel1.Invalidate();

}
1
19 мая 2013 года
kot_
7.3K / / 20.01.2000
Приведите свой код в нормальный вид, используя средства форматирования кода. Как ими пользоваться - http://forum.codenet.ru/q72176/
И сформулируйте нормально свой вопрос - ничего не возможно понять что вам нужно.
65K
19 мая 2013 года
yakuleb
7 / / 14.07.2011
Программа рисует в панели panel1 формы Form1 объекты rose и позволяет их перемещать. После изменения масштаба колесиком мышки в методе MouseWheel становится невозможным выделение мышью на экране объектов rose, поскольку после применения масштабирования координатные сетки panel1 и Graphics естессно не совпадают. Как получить координату курсора не относительно panel1, а относительно Graphics?
Код:
namespace Designer
{
    public partial class Form1 : Form
    {
        List  <Rose> roses = new List  <Rose>();//массив объектов
        Rose SelectedRose = null;//текущая
        Boolean draggig;//режим перетаскивания
        Point StartDragPoint;//точка начала перетаскивания
        float Scale = 1.0F;//масштаб (по умолчанию)
        Graphics grafika;
   
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void createrToolStripMenuItem_Click(object sender, EventArgs e) //Добавляет объект rose
        {
            Rose rose = new Rose("Роза " + roses.Count.ToString(),0,0);
            roses.Add(rose);
            panel1.Invalidate();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            grafika = e.Graphics;
            e.Graphics.ScaleTransform(Scale,Scale);//Изменение масштаба изображения
            foreach (Rose rose in roses)
                rose.Draw(e.Graphics);//Выводит объекты на Graphics
        }
       
        private void panel1_MouseWheel(object sender, MouseEventArgs e)
        {
            int scl = e.Delta;//прокрутка колеса мыши
            textBox3.Text = scl.ToString();
            Scale = Scale + scl/1000.0F; //Расчет масштаба изображения
            textBox4.Text = Scale.ToString();//Вывод значения масштаба
            panel1.Invalidate();//Перерисовка

        }
       
        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (draggig)
            {
                draggig = false;
                panel1.Invalidate();
            }
            else
            {
                Rose rose = GetItemAt(e.X, e.Y);
                if (rose != null)//Если курсор попал в область объекта rose
                {
                    SelectedRose = rose;
                    draggig = true;
                    StartDragPoint = e.Location;
                    DrawDraggingShape();

                }
            }

        }
        Rose GetItemAt(int x, int y)//возврат выбранного объекта rose
        {
            foreach (Rose currose in roses)
            {
                if (
                    //Проверка попадания в область rose
                    //Не работает по причине изменения
                    //координатной сетки после преобразования e.Graphics.ScaleTransform(Scale,Scale);
                    //Как получить координату относительно Graphics
                    //а не относительно panel1?
                    currose.X < x &&
                    currose.X + currose.Width > x &&
                    currose.Y < y &&
                    currose.Y + currose.Height > y
                    )
                    return currose;
                               
            }
            return null;//если курсор не попал в rose
        }
        void DrawDraggingShape()//Рисует рамку перетаскивания
        {
            //Point point2 = panel1.PointToClient()
            Point point = panel1.PointToScreen(SelectedRose.Location);
            ControlPaint.DrawReversibleFrame(new Rectangle(point, SelectedRose.Size), SystemColors.ButtonFace, FrameStyle.Dashed);
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            panel1.Focus();
            textBox1.Text = e.Location.X.ToString();//отслеживает координаты курсора
            //относительно panel1
            //а нужно относительно Graphics
            textBox2.Text = e.Location.Y.ToString();
 
            //textBox5.Text =... должен выводит координату Х курсора на panel1.Graphics
            //textBox6.Text = ... должен выводит координату У курсора на panel1.Graphics
                       
            if (draggig)//если перетаскивание
            {
                DrawDraggingShape();
                SelectedRose.X = SelectedRose.Location.X + (e.Location.X - StartDragPoint.X);//Изменение координат
                SelectedRose.Y = SelectedRose.Location.Y +(e.Location.Y-StartDragPoint.Y);
                DrawDraggingShape();
                StartDragPoint = e.Location;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Rose rose = new Rose("Роза " + roses.Count.ToString(), 0, 0);
            roses.Add(rose);
            panel1.Invalidate();

        }
    }
}
1
19 мая 2013 года
kot_
7.3K / / 20.01.2000
Например, выполнить преобразование
65K
23 мая 2013 года
yakuleb
7 / / 14.07.2011
Цитата: kot_
Например, выполнить преобразование


Преобразование выполнить не проблема. Только, насколько эффективным будет написание собственного алгоритма просчета координат по сравнению с уже готовыми методами?
Вопрос в том, есть ли готовые методы. Если есть методы масштабирования, значит должны быть и методы получения координат курсора над конкретным объектом.

341
27 мая 2013 года
Der Meister
874 / / 21.12.2007
Код:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        Matrix _transform = new Matrix();

        protected override void OnPaint(PaintEventArgs e) {
            base.OnPaint(e);

            e.Graphics.Transform = _transform;
            e.Graphics.DrawEllipse(Pens.Black, 0, 0, 50, 50);
        }

        protected override void OnMouseDown(MouseEventArgs e) {
            base.OnMouseDown(e);

            var transform = _transform.Clone();
            transform.Invert();

            var points = new[] {e.Location};
            transform.TransformPoints(points);

            MessageBox.Show(points[0].ToString());
        }

        private void _numericUpDown1_ValueChanged(object sender, EventArgs e) {
            var scale = (float) _numericUpDown1.Value;
            SetScale(scale);

            Invalidate();
        }

        void SetScale(float scale) {
            var transform = new Matrix();
            transform.Scale(scale, scale);

            _transform = transform;
        }
    }
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог