在绘制事件上调整绘制线的大小

时间:2017-05-19 21:34:58

标签: c# drawing picturebox zooming

我没有看到关于这个问题的几个问题,我尝试了所有解决方案,但没有一个适合我的情况。 我的代码正在运行;这个image显示了当我点击绘图按钮时会发生什么。 我需要放大那个绘图。是否可以编写像autocad feature" zoom / extent"?

的代码
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();
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

如果你知道所有的拼图,这并不是那么难。

让我们从明显的一个开始:

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

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

您还询问了如何使图纸居中“#”。这是一个非显而易见的概念:绘图表面的中心是什么?

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

一旦你这样做,你可以使用TranslateTransform将图形视口的原点移动到这一点。

一旦你完成了这一切,你几乎肯定会想要滚动

为此,您有两种选择:

  • 您可以在另一个控件中保持AutoScroll = false嵌套画布控件,通常是Panel,其中{{1} }};接下来使画布控件足够大,以便始终保持您的绘图,并且您已完成。

  • 或者您可以为画布控件启用AutoScroll = true并设置足够大的AutoScroll。如果您然后将当前滚动位置添加到翻译,您也完成了。让我们看看这个解决方案:

enter image description here

这是AutoScrollMinSize事件中的代码:

Paint

一些注意事项:

  • 我在中间画了一个橙色圆圈,表明这一点不变
  • 我的坐标从负面到正面,所以你可以看到这很好用。
  • 我画的笔宽很小;因此,只有在生成的笔超过1个像素时,绘图的宽度才会改变。不过,任何绘制总是以1像素宽度绘制。
  • 我首先进行翻译,然后进行缩放,这样我就不必计算缩放的位置。
  • 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); TrackBar事件中唯一的一行是触发Scroll事件:Paint

panel3.Invalidate();所需的唯一设置是

Panel

但是为了避免闪烁,强烈建议使用 panel3.AutoScroll = true; panel3.AutoScrollMinSize = new Size(500, 500); // use the size you want to allow! 子类,可能是这样的:

DoubleBuffered