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;
}
}
}
как узнать координаты курсора относительно Graphics если применен метод ScaleTransform?
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();
}
И сформулируйте нормально свой вопрос - ничего не возможно понять что вам нужно.
Код:
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();
}
}
}
{
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();
}
}
}
Например, выполнить преобразование
Цитата: kot_
Например, выполнить преобразование
Преобразование выполнить не проблема. Только, насколько эффективным будет написание собственного алгоритма просчета координат по сравнению с уже готовыми методами?
Вопрос в том, есть ли готовые методы. Если есть методы масштабирования, значит должны быть и методы получения координат курсора над конкретным объектом.