C#绘制大图(二叉树)WinForms

时间:2015-11-26 13:17:15

标签: c# winforms drawing binary-tree

我试图绘制二叉树 - 树的表示形式,而我却没有这样做。

我尝试使用图片绑定到PictureBox上的GDI绘图,但最终我的图片变得太大而我无法调整它的大小,然后我确实采用了Panel,我试图直接在它上画画 - 它效果更好,但是:

我从控制器的顶部中间开始并将其拉下来,不幸的是,在某些时候我的绘图上的-x和x大于我的控件的宽度(面板提醒),首先是左边的图纸似乎没有绘制(我假设它是因为它们超出了Panel的范围),第二件事,尽管我的Panel将AutoSize属性设置为True,但它没有得到调整大小。

我会理解如何实现它以便绘制它。

1 个答案:

答案 0 :(得分:0)

我认为@TaW已经说过,遗憾的是不能作为答案。 Panel将处理滚动,PictureBox将包含图像。

  • Panel设置为AutoScroll
  • 时,您需要True
  • 此面板中PictureBox需要SizeMode AutoSize设为Bitmap
  • 您完成所有绘图到PictureBox。完成后,将此位图分配到Bitmap bmp = new Bitmap(1000, 1000); using (Graphics g = Graphics.FromImage(bmp)) { g.FillRectangle(Brushes.Green, 0, 0, 10, 10); g.DrawEllipse(Pens.Black, 10, 10, 900, 900); } pictureBox1.Image = bmp;

绘图示例:

System.Windows.Forms.TableLayoutPanel tableLayoutPanel1 = null;

private void Form1_Load(object sender, EventArgs e)
{
    this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
    // 
    // tableLayoutPanel1
    // 
    this.tableLayoutPanel1.AutoScroll = true;
    this.tableLayoutPanel1.ColumnCount = 1;
    this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 2000));
    this.tableLayoutPanel1.Location = new System.Drawing.Point(25, 25);
    this.tableLayoutPanel1.Name = "tableLayoutPanel1";
    this.tableLayoutPanel1.RowCount = 1;
    this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 1000));
    this.tableLayoutPanel1.Size = new System.Drawing.Size(this.Width - 50, this.Height - 80);
    this.tableLayoutPanel1.TabIndex = 21;
    this.tableLayoutPanel1.Paint += new System.Windows.Forms.PaintEventHandler(this.tableLayoutPanel1_Paint);
    this.tableLayoutPanel1.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
    this.Controls.Add(this.tableLayoutPanel1);
    this.tableLayoutPanel1.BringToFront();
}

private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e)
{
    float virtualWidth = tableLayoutPanel1.ColumnStyles[0].Width;
    if (virtualWidth < 40000) //You can resize the area any time
    {
        tableLayoutPanel1.ColumnStyles[0].Width = 40000;
        tableLayoutPanel1.RowStyles[0].Height = 20000;
        tableLayoutPanel1.Invalidate();
        return;
    }

    e.Graphics.TranslateTransform(
        virtualWidth / 2 - tableLayoutPanel1.HorizontalScroll.Value,
        -tableLayoutPanel1.VerticalScroll.Value);

    int size = 50;
    for (int i = 0; i < 200; ++i)
    {
        for (int j = -i; j <= i; j++)
        {
            e.Graphics.DrawEllipse(Pens.Black, j * size * 2, i * size * 2, size, size);
        }
    }
}

修改

所以问题在于尺寸。您可以选择仅栅格化可见的部分。速度可能存在问题,但内存占用量最小。简单的概念证明:

$('#button2').click()

我选择了tableLayoutPanel1,其中包含一行和一列,它会滚动并让我设置工作区域。 tableLayoutPanel1可以在设计器中创建,我决定动态构造它只显示完全可用的示例(只需要分配Form1_Load事件)。您可以通过跳过无法看到的部分来加快速度,例如&#34; i&#34;的下限和上限范围。变量。您还可以将较大的部分栅格化为位图,并在您处于其范围内时从该位图进行复制。