4

在此处输入图像描述

在我进入我的问题之前,让我解释一下我的设置:

首先:我有一个 PictureBox ,其中包含一个在运行时生成的位图。这个位图可以是不同的宽度,但总是相同的高度。

第二: PictureBox 不支持滚动,因此,我将 PictureBox 停靠在面板中。最初,我使用了面板的自动滚动功能,但在我通过本文发现 PictureBox 有大小限制后放弃了该功能。我还了解到,最好使用小的 PictureBox 并且只绘制需要看到的内容而不是整个图像。

第三:所以我添加了一个 HScrollBar,它很好而且很花哨,但我似乎无法弄清楚使滚动条有多大背后的数学。我尝试将滚动条的最大值设置为位图的长度,但正如您所见,如果我使用自动滚动功能,我的滚动条的大小比 Windows 放入的要小得多。

我的问题是,滚动条大小背后的数学原理是什么?如何在我的自定义滚动条中模拟它?

如果我的问题不清楚,请告诉我,我会尽力使其更容易理解。并提前感谢您的帮助!

4

2 回答 2

3

我弄清楚了问题所在。也许我应该再试一试。:)

答案在于LargeChange物业。我让Maximum位于位图的总宽度,然后将 设置为LargeChange我想要显示的宽度。(即PictureBox的宽度)

“滚动条”的大小由 的值与LargeChange的值之比决定Maximum。例如,如果要显示的宽度 ( LargeChange) 是 100,总宽度 ( Maximum) 是 300,那么“滚动条”大小将是滚动条长度的 1/3。(100/300)。

于 2013-10-17T15:35:52.267 回答
1

我也遇到了同样的问题并试图弄清楚,我有一个面板,其中包含另一个名为 panelChild 的面板,默认滚动条很小,我需要更大的滚动条,所以我使用 HScrollBar 来做到这一点(显示在默认滚动条),我在这里发布我的解决方案,可能对某人有帮助

public Form() {
    InitializeComponent();

    hScrollBar.Maximum = panelChild.Width;
    hScrollBar.LargeChange = panel.Width; // panel which contain panelChild, and this hScrollBar will same as panel scrollbar
    hScrollBar.Scroll += HScrollBar_Scroll;
}

private void HScrollBar_Scroll(object sender, ScrollEventArgs e)
{
    int diference = e.OldValue - e.NewValue;
    foreach (Control c in panel.Controls)
    {
         c.Location = new Point(c.Location.X + diference, c.Location.Y);
    }
}
于 2017-09-24T00:27:55.413 回答