[英]how to move scaled lines in GDI+
I have a picture box. 我有一个画框。 In picture box I draw lines using: 在图片框中,我使用以下方式绘制线条:
gfx.DrawLine(nPen, line.xBegin, line.yBegin, line.xEnd, line.yEnd);
line
is an object containing lines beginning and end values. line
是一个包含行的开始和结束值的对象。
I draw 10x lines on that picture box. 我在那个图片框上画了10倍的线。 My mouse_Wheel listener contains code: 我的mouse_Wheel侦听器包含以下代码:
gfx.TranslateTransform((panelpreview.Width) / 2, (panelpreview.Height) / 2);
gfx.ScaleTransform(imageScale, imageScale);
gfx.TranslateTransform(-(panelpreview.Width) / 2, -(panelpreview.Height) / 2);
currently I am trying to move lines by: 目前,我正在尝试通过以下方式移动行:
private void panelPreview_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
checkLinesIntersection(e.Location); //checks if e.Location intersects with the line
panelPreview.MouseUp += new MouseEventHandler(panelPreview_MouseUpLine);
panelPreview.MouseMove += new MouseEventHandler(panelPreview_MouseMoveLine);
}
}
void panelPreview_MouseMoveLine(object sender, MouseEventArgs e)
{
if (_Leading.movable)
newFont.Leading = e.Y - (_base.yBegin + newFont._descenderHeight);
if (_xHeight.movable)
if (_base.yBegin - e.Y >= 0)
newFont.xHeight = _base.yBegin - e.Y;
if (_capHeight.movable)
if (_base.yBegin - e.Y >= 0)
newFont.capHeight = _base.yBegin - e.Y;
if (_ascenderHeight.movable)
if (_base.yBegin - e.Y >= 0)
newFont.ascenderHeight = _base.yBegin - e.Y;
if (_descenderHeight.movable)
if (e.Y - _base.yBegin >= 0)
newFont.descenderHeight = e.Y - _base.yBegin;
UpdatePreviewWindow();
}
void panelPreview_MouseUpLine(object sender, MouseEventArgs e)
{
panelPreview.MouseMove -= new MouseEventHandler(panelPreview_MouseMoveLine);
panelPreview.MouseUp -= new MouseEventHandler(panelPreview_MouseUpLine);
}
The problem is that after zooming in even though visually I do press on the line its not reacting the way it should. 问题在于,即使在视觉上放大后,我也确实按了该行,但并没有按照应有的方式做出反应。
public void checkLinesIntersection(Point mouseLocation)
{
lineIntersects(_Leading, mouseLocation);
lineIntersects(_xHeight, mouseLocation);
}
private void lineIntersects(nLine line, Point mouseLocation)
{
if (mouseLocation.X >= line.xBegin && mouseLocation.X <= line.xEnd)
if (mouseLocation.Y >= line.yBegin || mouseLocation.Y + 2 >= line.yBegin)
if (mouseLocation.Y <= line.yEnd || mouseLocation.Y - 2 <= line.yEnd)
switch (line.sName)
{
case "xHeight":
newFont.selectedLine = nFont.Lines._xHeight;
break;
default:
break;
}
}
So! 所以! After working for a while on this tool I changed the approach and used XNA to handle graphics (drawing, zooming, moving draw objects). 在使用该工具一段时间后,我改变了方法,并使用XNA处理图形(绘图,缩放,移动绘图对象)。 What helped me a lot was usage of Camera
in XNA and Matrix
to transform. 对我很有帮助的是在XNA和Matrix
使用Camera
进行转换。 ANYWAY! 无论如何! I am not gonna post my solution for XNA to handle this problem BUT by using XNA I found the approach to handle it in WinForms. 我不会使用XNA发布我的XNA解决方案来解决此问题,但我在WinForms中找到了解决该问题的方法。
float Zoom = 1f;
Microsoft.Xna.Framework.Rectangle mouseRect;
Matrix inverse;
void TAB_PICTURE_BOX_MouseWheel(object sender, MouseEventArgs e)
{
try
{
if (e.Delta > 0)
{
Zoom+= .1f;
}
if (e.Delta < 0)
{
Zoom -= .1f;
}
gfx.ResetTransform();
gfx.TranslateTransform((Width + img.Width) / 2, (Height - img.Height) / 2);
gfx.ScaleTransform(Zoom, Zoom);
gfx.TranslateTransform(-(Width + img.Width) / 2, -(Height - img.Height) / 2);
getInversePosition(e);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
And the final touch getInversePosition(e);
最后触摸getInversePosition(e);
method: 方法:
private void getInversePosition(MouseEventArgs e)
{
Matrix matrix = Matrix.CreateTranslation(new Vector3(-(Width + img.Width) / 2, -(Height - img.Height) / 2, 0)) *
Matrix.CreateScale(new Vector3(Zoom, Zoom, 1)) *
Matrix.CreateTranslation(new Vector3((Width + img.Width) / 2, (Height - img.Height) / 2, 0));
inverse = Matrix.Invert(matrix);
Vector2 mousePosition = Vector2.Transform(new Vector2(e.X, e.Y), inverse);
mouseRect = new Microsoft.Xna.Framework.Rectangle((int)mousePosition.X, (int)mousePosition.Y, 1, 1);
}
I am sure that there is a way to handle it without XNA involvement BUT in my scenario XNA made the work. 我确信,在我的场景中,有一种无需XNA参与即可处理它的方法,但XNA可以完成工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.