垂直&面板中的水平滚动条

时间:2013-10-06 16:10:29

标签: vb.net scrollbar panels

情景:

  • 在表单上放置一个面板。
  • 将面板的BorderStyle设置为FixedSingle。 (这样你就可以在运行时看到它。)
  • 设置面板的AutoScroll = True
  • 将面板的Anchor设置为Top,Left,Bottom,Right
  • 在面板内,放置任何相当大的控件(按钮,图片框或其他)。
  • 将控件的下边缘调整为面板底部上方几个像素。
  • 调整控件的右边缘应比面板更窄一些像素MINUS垂直滚动条的宽度。 (也就是说,它应该足够窄,以便为可能出现的垂直滚动条留出空间。)

现在运行它,并垂直调整窗体的大小,以便您可以看到一个VERTICAL滚动条。

问题:出现两个滚动条,因为垂直滚动条的存在会减小客户区的宽度,从而迫使水平滚动条出现。

显然,.NET首先评估是否需要垂直滚动条,然后评估水平是否应该出现,这取决于客户端大小是否因垂直scxrollbar的存在而减小。 (即同一个实验不会导致不必要的VERTICAL滚动条出现......只有水平滚动条。)

我正在使用VB2008 Express,但我猜这会延续到更高版本。

我需要的解决方案:我需要以下任何一种:A)“仅垂直自动滚动”面板。 B)我需要一种方法来告诉面板“重新思考”水平滚动条是否真的是必要的。 (刷新似乎没有。)

3 个答案:

答案 0 :(得分:3)

为了使用面板自动滚动属性,我这样做:

  1. panel.AutoScroll = False(反之,我知道:D)
  2. panel.VerticalScroll.Visible = False或panel.Horizo​​ntalScroll.Visible = False
  3. 为了了解睫毛棒的尺寸,请使用

    SystemInformation.HorizontalScrollBarHeight
    SystemInformation.VerticalScrollBarWidth
    

    因此,您可以在显示竖线条时更改面板的尺寸。

答案 1 :(得分:2)

AutoScroll属性不允许您对滚动条进行过多控制(即使您具有VerticalScrollHorizontalScroll属性)。

在拟议的替代方案中,我选择A; this post中的标记答案为同等问题提供了一个非常有效的解决方案。转换后的&改编的代码(其中Panel1是您问题中提到的小组):

Private Declare Function ShowScrollBar Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Try
        ShowScrollBar(Panel1.Handle, 0, False)
    Catch ex As Exception
    End Try
    MyBase.WndProc(m)
End Sub

如果您将面板的AutoScroll属性设置为true并添加此代码,您将获得所需内容。

注意:建议的代码有效但价格一定:我个人打算尽可能避免使用Protected Overrides Sub WndProc代码。如果准确地获得此功能对您来说很重要,请依赖于所提出的方法;否则,您可能需要考虑其他替代方案(例如,AutoScroll = False并在面板中添加VScrollBar,这将始终存在。

答案 2 :(得分:1)

我遇到的东西听起来就像你描述的那样。我只想要一个垂直滚动,因为它最终将包含许多东西,但不是水平滚动。我用了一个表布局面板;设置面板的垂直尺寸,以便VScroll显示;设置宽度以适应将要进入的内容以及代码将使用的任何边距或装订线。

然后,在TableLayoutPanel中将滚动面板的宽度设置为绝对(我使用了比panel.width多2个像素)。如果/当用户调整大小时,所有额外的大小将分配给其他所有内容。基本上不要让滚动面板的宽度发生变化。可能必须/想要设置最小的表单大小。

我添加的东西都是相同的宽度,如果你的宽度不同,你可能需要设置它以适应最宽的。

不确定你是否遇到同样的事情,但确实听起来像是这样。