我试图绘制二叉树 - 树的表示形式,而我却没有这样做。
我尝试使用图片绑定到PictureBox上的GDI绘图,但最终我的图片变得太大而我无法调整它的大小,然后我确实采用了Panel,我试图直接在它上画画 - 它效果更好,但是:
我从控制器的顶部中间开始并将其拉下来,不幸的是,在某些时候我的绘图上的-x和x大于我的控件的宽度(面板提醒),首先是左边的图纸似乎没有绘制(我假设它是因为它们超出了Panel的范围),第二件事,尽管我的Panel将AutoSize属性设置为True,但它没有得到调整大小。
我会理解如何实现它以便绘制它。
答案 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;的下限和上限范围。变量。您还可以将较大的部分栅格化为位图,并在您处于其范围内时从该位图进行复制。