【问题标题】:Panel Drawing zoom in C#C# 中的面板绘图放大
【发布时间】:2015-11-19 04:10:05
【问题描述】:

我有一个包含面板的表单,在此面板中我绘制形状,如矩形和圆形,我需要放大这些形状,我看到了几个选项,但其中大多数使用 PictureBox。我应该使用位图将面板区域创建为位图并更改缩放系数吗?如果我想要平移并且不绘制不适合面板大小的图像,这是否会进一步帮助我。

这是我的代码的快照

  private void panel1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = panel1.CreateGraphics();
        SolidBrush myBrush = new SolidBrush(Color.Black);
        Pen p = new Pen(Color.Black);
        int RecScale = 1;
        foreach (CircuitData.ResistorRow resistorRow in ResistorData.Resistor)
        {
            RectangleF rec = new RectangleF((float)(resistorRow.CenterX - resistorRow.Length / 2), (float)(resistorRow.CenterY - resistorRow.Width/ 2), (float)resistorRow.Length, (float)resistorRow.Width);
            float orientation = 360 - (float)resistorRow.Orientation;
            PointF center = new PointF((float)resistorRow.CenterX, (float)resistorRow.CenterY);
            PointF[] points = CreatePolygon(rec, center, orientation);
            if (!Double.IsNaN(resistorRow.HiX) && !Double.IsNaN(resistorRow.HiY))
            {
                g.FillEllipse(myBrush, (float)resistorRow.HiX - 5 , (float)resistorRow.HiY - 5, 10, 10);
                g.DrawLine(p, new PointF((float)resistorRow.HiX, (float)resistorRow.HiY), center);
            }
            g.FillPolygon(myBrush, points);
        }
    }

能否提供示例代码。 非常感谢

日本

【问题讨论】:

  • 如果您愿意,您可以缩放 Graphics 对象。但首先修复您的绘画事件中的损坏代码!!!将Graphics g = panel1.CreateGraphics(); 换成Graphics g = e.Graphics;

标签: c# winforms zooming panel


【解决方案1】:

这是一种按scaling the Graphics对象缩放绘图的方法:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.ScaleTransform(zoom, zoom);

    // 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);

}

我们在这里存储缩放级别:

float zoom = 1f;

我们在这里设置它并更新面板:

private void trackBar1_Scroll(object sender, EventArgs e)
{
   // for zooming between, say 5% - 500%
   // let the value go from 50-50000, and initialize to 100 !
    zoom = trackBar1.Value / 100f;  
    panel1.Invalidate();
}

两个示例截图:

请注意,这也可以很好地缩放 Pen 的宽度。打开抗锯齿是个好主意..:g.SmoothingMode = SmoothingMode.AntiAlias;

【讨论】:

  • 是否可以放一个滚动条来查看放大后的内容?
  • @Abhishek,你得到了缩放图片并在面板中获取滚动条的解决方案,(滚动条是拖动并查看图像的其余部分)
  • 更简单的解决方案是将 panel1 放入具有自动滚动功能的 panel2 中。或者为 panel1 设置自动滚动和最小尺寸。
【解决方案2】:

由于您是从头开始绘图,您不能根据缩放系数调整绘图的大小吗?

您可以将绘图尺寸乘以缩放系数。假设您的缩放系数为:

  • 0.5 表示 50 % 缩放 (这会减小绘图尺寸)
  • 1.0 for 100% (实际尺寸)
  • 1.5 for 150 % (更大的尺寸),你可以这样计算宽度:
object.Width = originalWidth * zoomFactor;

【讨论】:

  • 通过说对象宽度是我的代码案例中的图形对象 g 或我正在绘制的每个形状。
  • 每个对象。事实上,您需要对每个对象维度都这样做。
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 2011-10-17
  • 1970-01-01
  • 2019-05-03
相关资源
最近更新 更多