【问题标题】:Resizing drawlines on a paint event在绘画事件上调整绘制线的大小
【发布时间】:2017-10-20 03:09:56
【问题描述】:

我很少看到关于这个问题的问题,我尝试了所有解决方案,但没有一个适合我的情况。 我的代码正在运行;这个image 显示了当我点击绘图按钮时会发生什么。 我需要放大该图。是否可以编写类似 autocad 功能“缩放/范围”的代码?

Pen myPen = new Pen(Color.Black);
int centerpointx, centerpointy;
private void pictureBoxDraw_Paint(object sender, PaintEventArgs e)
    {
        centerpointx = pictureBoxDraw.Size.Width/2;
        centerpointy = pictureBoxDraw.Size.Height/2;

        myPen.Width = 2;
        if (binary > 0)
        {
            var sizecrestgeo = 40;
            var distancearraycrestgeo = new float[sizecrestgeo];
            var elevationarraycrestgeo = new float[sizecrestgeo];
            for (int i = 0; i < sizecrestgeo; i++)
            {
                distancearraycrestgeo[i] = float.Parse(dataGridViewCrestGeo.Rows[i].Cells[0].Value.ToString());
                elevationarraycrestgeo[i] = float.Parse(dataGridViewCrestGeo.Rows[i].Cells[1].Value.ToString())*-1;

            }
            for (int i=0; i < sizecrestgeo-1; i++)
            {
            e.Graphics.DrawLine(myPen, distancearraycrestgeo[i]+centerpointx, elevationarraycrestgeo[i]+centerpointy, distancearraycrestgeo[i + 1]+centerpointx, elevationarraycrestgeo[i + 1]+centerpointy);
            }
        }
        else
        {
        }
    }

    private void buttonDraw_Click_1(object sender, EventArgs e)
    {
        if (Hd > 0.0001)
        {
            binary = 1;
            pictureBoxDraw.Invalidate();
        }
        else
        {
            MessageBox.Show("No data to draw, perform analysis first.");
        }

    }

    private void buttoncleardraw_Click(object sender, EventArgs e)
    {
        binary = 0;
        pictureBoxDraw.Invalidate();
    }
}

【问题讨论】:

  • 您可以缩放 Graphics 对象。有关示例,请参阅 herehere
  • 请注意,即使是笔的宽度也会被缩放,因此您可能希望在您的 Paint 中使用小于 1px 的宽度。它们仍将以至少 1 像素的尺寸绘制。
  • @TaW 有用的示例和警告,谢谢。 img1 img2 其实这不是我想要的。我不希望用户控制它,我应该以某种方式将绘图居中..
  • 要保持点居中,您将添加一个 TranslateTransform。提前计划可能的滚动!
  • @TaW 你能给我举个例子吗?我不知道 TranslateTransform 的事情..

标签: c# drawing picturebox zooming


【解决方案1】:

只要你知道所有的拼图,这并不难。

让我们从显而易见的开始:

  • 您可以缩放Graphics 对象以使用ScaleTransform 创建缩放图形。

正如我所提到的,这将包括笔的宽度、字体大小以及您绘制的任何图像(尽管不包括 HatchBrush 的阴影线)。

您还询问了保持绘图“居中”的问题。这是一个不明显的概念:您的绘图表面的中心是什么?

缩放时(就像旋转一样),您始终需要知道缩放(或旋转)的中心点。默认情况下,这是原点(0,0)。我选择了Panel 的中心。您可能想选择其他点..

完成后,您可以使用TranslateTransform 将图形视口的原点移动到该点。

一旦你完成了所有这些,你几乎肯定会想要允许滚动

为此,您有两种选择:

  • 您可以将AutoScroll = false嵌套 画布控件保留在另一个 控件中,通常是Panel,其中有AutoScroll = true;接下来使画布控件足够大以始终容纳您的绘图,然后您就完成了。

  • 或者您可以为画布控件打开AutoScroll,并设置足够大的AutoScrollMinSize。如果您随后将当前滚动位置添加到翻译中,您也完成了。让我们看看这个解决方案的实际效果:

这是Paint事件中的代码:

Size sz = panel3.ClientSize;
Point center = new Point(sz.Width / 2, sz.Height / 2);
Graphics g = e.Graphics;

// center point for testing only!
g.DrawEllipse(Pens.Orange, center.X - 3, center.Y - 3, 6, 6);

// you determine the value of the zooming!
float zoom = (trackBar1.Value+1) / 3f;

// move the scrolled center to the origon
g.TranslateTransform(center.X + panel3.AutoScrollPosition.X, 
                        center.Y + panel3.AutoScrollPosition.Y);
// scale the graphics
g.ScaleTransform(zoom, zoom);

// draw some stuff..
using(Pen pen = new Pen(Color.Yellow, 0.1f))
for (int i = -100; i < 100; i+= 10)
        g.DrawEllipse(Pens.Yellow, i-22,i-22,44,44);

几点说明:

  • 我在中心画了一个橙色圆圈,表示该点不变
  • 我的坐标是从负到正的,所以你可以看到这很好用。
  • 我用很小的笔宽作画;所以绘图的宽度只有在生成的笔超过 1 个像素时才会改变。不过,任何绘制都将始终以 1 像素宽度绘制。
  • 我先平移然后缩放,因此我不必计算缩放位置。
  • TrackBarScroll事件中唯一一行是触发Paint事件:panel3.Invalidate();

Panel 所需的唯一设置是

 panel3.AutoScroll = true;
 panel3.AutoScrollMinSize = new Size(500, 500);  // use the size you want to allow!

但是为了避免闪烁,强烈建议使用DoubleBuffered 控件,可能是Panel 子类,如下所示:

class DrawPanel : Panel
{
    public DrawPanel()      { DoubleBuffered = true;  }
}

更新: 可以使用 PictureboxLabel(与 Autosize=false );两者都具有开箱即用的DoubleBuffered 属性,并且比Panels 更支持绘图。

【讨论】:

    【解决方案2】:

    Graphics.ScaleTransform() 是缩放的方式。尝试在您的绘画事件处理程序中使用类似的东西:

    e.Graphics.ScaleTransform(2.0F, 2.0F);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2015-12-22
      • 1970-01-01
      • 2017-06-02
      相关资源
      最近更新 更多