如何实现自定义控件的滚动?我的控件是完全自定义绘制的,它的高度是可变的,并且控件的一部分包含一个菜单,所以如果控件中有许多项,我需要能够将滚动条放在那里。我真的找不到任何关于如何做到这一点的线索。我确实看到了一些关于ScrollableControl的东西,但我仍然不确定这是否是我需要的。
另外,我的控件如何知道什么时候需要显示滚动条?因为我的控件是完全自定义绘制的,所以没有真正的“控件”,它只是绘制在它上面的一堆像素,所以我不能简单地将AutoScroll设置为true,因为它不是需要滚动的控件的主要部分,而是控件上需要滚动条的特定位置。
发布于 2014-10-13 22:00:09
如果您的自定义控件继承自Panel控件,则只需通过此设置在自定义控件中自行设置内容的大小:
this.AutoScrollMinSize = New Size(yourWidth, yourHeight);如果你的控件的ClientSize.Height大于yourHeight,你将不会得到任何滚动条。如果小于这个值,你就会得到一个滚动条。
在paint方法中,将以下内容添加到开头:
protected override void OnPaint(PaintEventArgs e) {
e.Graphics.TranslateTransform(this.AutoScrollPosition.X,
this.AutoScrollPosition.Y);现在,您绘制的所有内容都会自动转换为滚动坐标。
发布于 2014-10-12 16:03:30
您有两个选择。
好消息是,这是可能的,而且两者都不是真的很难。
首先让你的控件,我使用一个Panel,让Autoscroll=true;
然后您需要添加一个虚拟控件,我使用另一个Panel,可能像这样,足够靠近右侧和底部,以强制ScrollBars显示:
public Form1()
{
InitializeComponent();
Panel panelDummy = new Panel();
panelDummy.Size = new Size(1,1);
panelDummy.Location = new Point(yourMaxX,yourMaxY);
panel1.Controls.Add(panelDummy);
}然后你需要调整你的绘图代码。下面是如何实现的:
private void panel1_Paint(object sender, PaintEventArgs e)
{
int xx = panel1.HorizontalScroll.Value;
int yy = panel1.VerticalScroll.Value;
e.Graphics.FillRectangle(Brushes.Wheat, new Rectangle(11 - xx, 22 - yy, 22, 311));
e.Graphics.FillRectangle(Brushes.RosyBrown, new Rectangle(11 - xx, 280 - yy, 22, 3));
}
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
panel1.Invalidate();
}我已经向Scroll事件添加了一个Invalidate,以避免混乱的绘制结果。
另一个选项更简单:使您的控件足够大,以容纳所有绘制的控件,并使用AutoScroll=true;将整个滚动任务委托给包含面板的
Panel。发布于 2014-10-12 13:55:55
您可以在AutoScroll = true中使用Panel。在此之后,如果您将任何控件放入其中,只要它们的大小大于面板的大小,面板就会自动显示滚动条。这个技巧也可以用于任何自定义控件,只要你将它放在AutoScroll面板中,并根据需要调整大小即可。
https://stackoverflow.com/questions/26322209
复制相似问题