在 C# 中从面板平移绘图
Panning a drawing from a panel in C#
我有一个绘图应用程序,我使用 Graphic
对象来绘制矩形、圆形和一些线条。该应用程序具有缩放功能,但我试图让平移工作但找不到最佳解决方案。
public partial class Form1 : Form
{
protected Point clickPosition;
protected Point scrollPosition;
protected Point lastPosition;
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
AutoScroll = true;
AutoScrollMinSize = new Size(0, 0);
}
float zoom = 100f;
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.ScaleTransform(zoom, zoom);
g.SmoothingMode = SmoothingMode.AntiAlias;
// some demo drawing:
Rectangle rect = panel1.ClientRectangle;
g.DrawEllipse(Pens.Firebrick, rect);
using (Pen pen = new Pen(Color.DarkBlue, 4f))
g.DrawLine(pen, 22, 22, 88, 88);
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
zoom = trackBar1.Value / 10f;
panel1.Invalidate();
}
protected override void OnMouseDown(MouseEventArgs e)
{
clickPosition.X = e.X;
clickPosition.Y = e.Y;
}
protected override void OnMouseUp(MouseEventArgs e)
{
Cursor = Cursors.Default;
lastPosition.X = AutoScrollPosition.X;
lastPosition.Y = AutoScrollPosition.Y;
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Cursor = Cursors.Hand;
scrollPosition.X = clickPosition.X - e.X - lastPosition.X;
scrollPosition.Y = clickPosition.Y - e.Y - lastPosition.Y;
AutoScrollPosition = scrollPosition;
panel1.Invalidate();
}
}
private void Viewer_MouseDown(object sender, MouseEventArgs e)
{
OnMouseDown(e);
}
private void Viewer_MouseMove(object sender, MouseEventArgs e)
{
OnMouseMove(e);
}
private void Viewer_MouseUp(object sender, MouseEventArgs e)
{
OnMouseUp(e);
}
}
这是我目前所拥有的,代码缺少两件事,一个是使用 AutoScrollMinSize
更新最小大小和 AutoScrollPosition
获取最新位置,问题是两者都可以使用DrawImage
和 Images
我不确定在我的情况下如何让它与线条图和圆圈一起工作。同样出于某种原因,我的 AutoScrollPosition
对于 x
和 y
始终为 0。
任何想法,或者是否有其他方法来创建平移效果
您可以对平移使用与缩放完全相同的技巧:平移用于绘图的Graphics
对象!
只需添加一个(或垂直平移两个)数字,例如 offSetX and offsetY
到您的应用程序。您可以使用 Trackbar
或 NumericUpDown
或任何其他方式控制它..
现在添加这一行 translates(平移)Graphics
对象绘制的所有内容,在 ScaleTransform
之前:
g.TranslateTransform(offSetX , offSetY);
这会将所有内容向右或向左、向上或向下移动这么多像素..
请注意,这包括 Graphics 对象绘制的所有内容,包括它绘制的所有图像。
但是这不会移动 BackgroundImage
如果你有一个..要移动它们你应该使用 two Panels
: A panelFrame
打开 AutoSize
和更大的 panelCanvas
嵌套在 框架面板中,并通过使用滚动条在其中移动..
我有一个绘图应用程序,我使用 Graphic
对象来绘制矩形、圆形和一些线条。该应用程序具有缩放功能,但我试图让平移工作但找不到最佳解决方案。
public partial class Form1 : Form
{
protected Point clickPosition;
protected Point scrollPosition;
protected Point lastPosition;
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
AutoScroll = true;
AutoScrollMinSize = new Size(0, 0);
}
float zoom = 100f;
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.ScaleTransform(zoom, zoom);
g.SmoothingMode = SmoothingMode.AntiAlias;
// some demo drawing:
Rectangle rect = panel1.ClientRectangle;
g.DrawEllipse(Pens.Firebrick, rect);
using (Pen pen = new Pen(Color.DarkBlue, 4f))
g.DrawLine(pen, 22, 22, 88, 88);
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
zoom = trackBar1.Value / 10f;
panel1.Invalidate();
}
protected override void OnMouseDown(MouseEventArgs e)
{
clickPosition.X = e.X;
clickPosition.Y = e.Y;
}
protected override void OnMouseUp(MouseEventArgs e)
{
Cursor = Cursors.Default;
lastPosition.X = AutoScrollPosition.X;
lastPosition.Y = AutoScrollPosition.Y;
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Cursor = Cursors.Hand;
scrollPosition.X = clickPosition.X - e.X - lastPosition.X;
scrollPosition.Y = clickPosition.Y - e.Y - lastPosition.Y;
AutoScrollPosition = scrollPosition;
panel1.Invalidate();
}
}
private void Viewer_MouseDown(object sender, MouseEventArgs e)
{
OnMouseDown(e);
}
private void Viewer_MouseMove(object sender, MouseEventArgs e)
{
OnMouseMove(e);
}
private void Viewer_MouseUp(object sender, MouseEventArgs e)
{
OnMouseUp(e);
}
}
这是我目前所拥有的,代码缺少两件事,一个是使用 AutoScrollMinSize
更新最小大小和 AutoScrollPosition
获取最新位置,问题是两者都可以使用DrawImage
和 Images
我不确定在我的情况下如何让它与线条图和圆圈一起工作。同样出于某种原因,我的 AutoScrollPosition
对于 x
和 y
始终为 0。
任何想法,或者是否有其他方法来创建平移效果
您可以对平移使用与缩放完全相同的技巧:平移用于绘图的Graphics
对象!
只需添加一个(或垂直平移两个)数字,例如 offSetX and offsetY
到您的应用程序。您可以使用 Trackbar
或 NumericUpDown
或任何其他方式控制它..
现在添加这一行 translates(平移)Graphics
对象绘制的所有内容,在 ScaleTransform
之前:
g.TranslateTransform(offSetX , offSetY);
这会将所有内容向右或向左、向上或向下移动这么多像素..
请注意,这包括 Graphics 对象绘制的所有内容,包括它绘制的所有图像。
但是这不会移动 BackgroundImage
如果你有一个..要移动它们你应该使用 two Panels
: A panelFrame
打开 AutoSize
和更大的 panelCanvas
嵌套在 框架面板中,并通过使用滚动条在其中移动..