使面板可滚动
Make Panel scrollable
我正在开发一个简单的 Windows 表单应用程序,它包含一个 Panel
,我在其中使用 Graphic
绘制图形。比方说,我的面板现在的大小是 300x300,但里面的内容是 500x500。显然,我需要向 Panel
.
添加滚动条
到目前为止我的代码:
public CircuitControl()
{
// Initialize empty list of circuit objects
CircuitObjects = new List<CircuitObject>();
drawingAreaPanel.AutoScroll = true;
drawingAreaPanel.VerticalScroll.Enabled = true;
drawingAreaPanel.VerticalScroll.Visible = true;
drawingAreaPanel.HorizontalScroll.Enabled = true;
drawingAreaPanel.MaximumSize = new Size(300, 300);
drawingAreaPanel.Size = new Size(600, 600);
}
但是 none 这些代码实际上创建了一个滚动条。我的问题是:在哪里以及如何设置我实际绘制的 Panel
的大小?我认为这是缺少的部分。谢谢。
只需添加:
drawingAreaPanel.AutoScroll = true;
而且会自动完成。
€dit:不要忘记设置锚点以获得滚动条。
滚动条只有在 Panel
中确实存在您无法全部看到的内容后才会显示。
尝试在 Panel
内放置一个更大的控件,例如 PictureBox
,并将 PictureBox
的初始大小设置为大于 Panel
。
一个简洁明了的方法是设置 AutoScrollMinSize
。这会显示滚动条(如果您将另一个值保留为 0,则只显示一个)。
现在通过图形对象绘制将不会自动滚动。
这可以通过变换矩阵轻松实现,变换矩阵在绘制之前设置并通过滚动偏移平移绘图。
一个漂亮的例子:(这当然会闪烁而无需进一步优化)
private void button1_Click(object sender, EventArgs e)
{
using(Form frm = new Form())
{
Panel pnl = new Panel();
pnl.Paint += delegate (Object snd, PaintEventArgs e2) {
Matrix mtx = new Matrix();
mtx.Translate(pnl.AutoScrollPosition.X, pnl.AutoScrollPosition.Y);
e2.Graphics.Transform = mtx;
e2.Graphics.Clear(Color.Black);
for(int i=0; i <= 125; i++)
for(int j=0; j <= 125; j++)
using(Brush b = new SolidBrush(Color.FromArgb(255, 255-i*2, j*2, (i*j) % 255)))
e2.Graphics.FillRectangle(b, new Rectangle(5+j*20, 5+i*20, 20, 20));
};
pnl.AutoScrollMinSize = new Size(126*20+10, 126*20+10);
pnl.Dock = DockStyle.Fill;
frm.Controls.Add(pnl);
frm.Padding = new Padding(25);
frm.ShowDialog(this);
}
}
我正在开发一个简单的 Windows 表单应用程序,它包含一个 Panel
,我在其中使用 Graphic
绘制图形。比方说,我的面板现在的大小是 300x300,但里面的内容是 500x500。显然,我需要向 Panel
.
到目前为止我的代码:
public CircuitControl()
{
// Initialize empty list of circuit objects
CircuitObjects = new List<CircuitObject>();
drawingAreaPanel.AutoScroll = true;
drawingAreaPanel.VerticalScroll.Enabled = true;
drawingAreaPanel.VerticalScroll.Visible = true;
drawingAreaPanel.HorizontalScroll.Enabled = true;
drawingAreaPanel.MaximumSize = new Size(300, 300);
drawingAreaPanel.Size = new Size(600, 600);
}
但是 none 这些代码实际上创建了一个滚动条。我的问题是:在哪里以及如何设置我实际绘制的 Panel
的大小?我认为这是缺少的部分。谢谢。
只需添加:
drawingAreaPanel.AutoScroll = true;
而且会自动完成。
€dit:不要忘记设置锚点以获得滚动条。
滚动条只有在 Panel
中确实存在您无法全部看到的内容后才会显示。
尝试在 Panel
内放置一个更大的控件,例如 PictureBox
,并将 PictureBox
的初始大小设置为大于 Panel
。
一个简洁明了的方法是设置 AutoScrollMinSize
。这会显示滚动条(如果您将另一个值保留为 0,则只显示一个)。
现在通过图形对象绘制将不会自动滚动。
这可以通过变换矩阵轻松实现,变换矩阵在绘制之前设置并通过滚动偏移平移绘图。
一个漂亮的例子:(这当然会闪烁而无需进一步优化)
private void button1_Click(object sender, EventArgs e)
{
using(Form frm = new Form())
{
Panel pnl = new Panel();
pnl.Paint += delegate (Object snd, PaintEventArgs e2) {
Matrix mtx = new Matrix();
mtx.Translate(pnl.AutoScrollPosition.X, pnl.AutoScrollPosition.Y);
e2.Graphics.Transform = mtx;
e2.Graphics.Clear(Color.Black);
for(int i=0; i <= 125; i++)
for(int j=0; j <= 125; j++)
using(Brush b = new SolidBrush(Color.FromArgb(255, 255-i*2, j*2, (i*j) % 255)))
e2.Graphics.FillRectangle(b, new Rectangle(5+j*20, 5+i*20, 20, 20));
};
pnl.AutoScrollMinSize = new Size(126*20+10, 126*20+10);
pnl.Dock = DockStyle.Fill;
frm.Controls.Add(pnl);
frm.Padding = new Padding(25);
frm.ShowDialog(this);
}
}