我有一个绘图应用程序,我使用Graphic
对象绘制一个矩形和圆圈和一些线条。该应用程序具有缩放功能,但我试图让Panning工作,但无法找到最佳解决方案。
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
来获取最新位置,问题是两者都可以用{{ 1}}和DrawImage
我在我的案例中不确定如何使用线条图和圆圈。出于某种原因,我的Images
始终为0 AutoScrollPosition
和x
。
任何想法,还是有另一种方法来创建泛效果
答案 0 :(得分:2)
您可以使用平移与缩放相同的技巧:平移用于绘图的Graphics
对象!
只需添加一个(或垂直平移以及两个)数字,例如offSetX and offsetY
到您的应用程序。您可以使用Trackbar
或NumericUpDown
或以任何其他方式对其进行控制..
现在添加translates(平移)Graphics
对象绘制的所有内容,之前 ScaleTransform
:
g.TranslateTransform(offSetX , offSetY);
这将向右或向左,向上或向下移动所有像素的所有内容。
请注意,这包括Graphics对象绘制的所有内容,包括它绘制的所有图像。
但如果你有BackgroundImage
,这不会移动..要移动它们,你应该使用两个 Panels
:panelFrame
{ {1}}和更大的AutoSize
在框架面板中嵌套,并使用滚动条在其中移动..