首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现自定义控件的滚动?

如何实现自定义控件的滚动?
EN

Stack Overflow用户
提问于 2014-10-12 13:32:46
回答 4查看 5.5K关注 0票数 2

如何实现自定义控件的滚动?我的控件是完全自定义绘制的,它的高度是可变的,并且控件的一部分包含一个菜单,所以如果控件中有许多项,我需要能够将滚动条放在那里。我真的找不到任何关于如何做到这一点的线索。我确实看到了一些关于ScrollableControl的东西,但我仍然不确定这是否是我需要的。

另外,我的控件如何知道什么时候需要显示滚动条?因为我的控件是完全自定义绘制的,所以没有真正的“控件”,它只是绘制在它上面的一堆像素,所以我不能简单地将AutoScroll设置为true,因为它不是需要滚动的控件的主要部分,而是控件上需要滚动条的特定位置。

EN

回答 4

Stack Overflow用户

发布于 2014-10-13 22:00:09

如果您的自定义控件继承自Panel控件,则只需通过此设置在自定义控件中自行设置内容的大小:

代码语言:javascript
运行
复制
this.AutoScrollMinSize = New Size(yourWidth, yourHeight);

如果你的控件的ClientSize.Height大于yourHeight,你将不会得到任何滚动条。如果小于这个值,你就会得到一个滚动条。

在paint方法中,将以下内容添加到开头:

代码语言:javascript
运行
复制
protected override void OnPaint(PaintEventArgs e) {
  e.Graphics.TranslateTransform(this.AutoScrollPosition.X,
                                this.AutoScrollPosition.Y);

现在,您绘制的所有内容都会自动转换为滚动坐标。

票数 8
EN

Stack Overflow用户

发布于 2014-10-12 16:03:30

您有两个选择。

好消息是,这是可能的,而且两者都不是真的很难。

  • 坏消息是,对于一种选择,你必须调整你所有的绘图代码:

首先让你的控件,我使用一个Panel,让Autoscroll=true;

然后您需要添加一个虚拟控件,我使用另一个Panel,可能像这样,足够靠近右侧和底部,以强制ScrollBars显示:

代码语言:javascript
运行
复制
public Form1()
{
    InitializeComponent();

    Panel panelDummy = new Panel();
    panelDummy.Size = new Size(1,1);
    panelDummy.Location = new Point(yourMaxX,yourMaxY);
    panel1.Controls.Add(panelDummy);
}

然后你需要调整你的绘图代码。下面是如何实现的:

代码语言:javascript
运行
复制
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;将整个滚动任务委托给包含面板的

  • a Panel
票数 1
EN

Stack Overflow用户

发布于 2014-10-12 13:55:55

您可以在AutoScroll = true中使用Panel。在此之后,如果您将任何控件放入其中,只要它们的大小大于面板的大小,面板就会自动显示滚动条。这个技巧也可以用于任何自定义控件,只要你将它放在AutoScroll面板中,并根据需要调整大小即可。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26322209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档