如何强制垂直滚动条始终可以从WinForms中的AutoScroll中看到?

use*_*203 10 scrollbars winforms autoscroll

使用VS2010和.NET 4.0与C#和WinForms:

我总是希望一个垂直滚动条显示为我的面板作为禁用滚动条(当它不需要时,并在可以使用时启用它).

所以它就像一个混合AutoScroll.我已经尝试过使用VScrollBars,但是我无法弄清楚将它们放在哪里以使其工作.

基本上我有一个用户控件充当控件的"文档",它的大小会发生变化,因此在使用自动滚动时它可以很好地工作.当用户控件不适合并且用户可以将其向上移动时,会出现滚动条.

它本质上就像一个Web浏览器.但是,重绘控件需要很长时间(它是在面板内的网格中的组内具有许多字段和按钮等的形式:P

所以无论如何,当autoscroll启用垂直滚动条时,重绘窗口需要一段时间.我想总是显示如上所示的垂直滚动条(具有启用/禁用功能).

如果有人有一些帮助,我已经阅读了很多关于autoscroll主题的帖子,但没有人问过我在问什么,我无法想出一个解决方案.

fia*_*iat 9

C# Version of competent_Tech's answer

using System.Runtime.InteropServices; 

public class MyUserControl : UserControl
{
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool ShowScrollBar(IntPtr hWnd, int wBar, bool bShow);

    private enum ScrollBarDirection
    {
        SB_HORZ = 0,
        SB_VERT = 1,
        SB_CTL = 2,
        SB_BOTH = 3
    }

    public MyUserControl()
    {
        InitializeComponent();
        ShowScrollBar(this.Handle, (int) ScrollBarDirection.SB_VERT, true);
    }
}
Run Code Online (Sandbox Code Playgroud)


com*_*ech 4

您可以使用面板的自动滚动功能,只需向其发送一条 Windows 消息即可显示垂直滚动条:

<DllImport("user32.dll")> _
Public Shared Function ShowScrollBar(ByVal hWnd As System.IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean
End Function

Private Const SB_VERT As Integer = 1


Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ShowScrollBar(Panel1.Handle, SB_VERT, True)
End Sub
Run Code Online (Sandbox Code Playgroud)

滚动条将显示并看起来好像可以滚动,但在实际准备好滚动之前它不会执行任何操作。如果禁用它,它不会自动重新启用,因此这可能是最好的方法。

此外,为了提高调整大小时的性能,您可以在更新之前调用面板上的SuspendLayout ,并在完成后调用ResumeLayout