【问题标题】:Change scrollbar position in TextBox?更改 TextBox 中的滚动条位置?
【发布时间】:2011-05-28 12:10:34
【问题描述】:

如果我想改变TextBox的滚动条的位置,除此之外我还需要做什么:

SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

此函数仅更改滚动条位置,但不会更新实际的TextBox(因此滚动条“滚动”,但文本不会)。有什么建议?我在 Visual Studio 2008 中使用 Windows 窗体和 .NET 4。

【问题讨论】:

    标签: c# .net c++ winforms scrollbar


    【解决方案1】:

    首先,定义一个常量值:

    const int EM_LINESCROLL = 0x00B6;
    

    然后,声明user32.dll的两个外部方法:

    [DllImport("user32.dll")]
    static extern int SetScrollPos(IntPtr hWnd, int nBar, 
                                   int nPos, bool bRedraw);
    [DllImport("user32.dll")]
    static extern int SendMessage(IntPtr hWnd, int wMsg, 
                                   int wParam, int lParam);
    

    最后,用这些方法做实事:

    SetScrollPos(myTextBox.Handle,1,myTextBox.Lines.Length-1,true);
    SendMessage(myTextBox.Handle,EM_LINESCROLL,0,
                                 myTextBox.Lines.Length-1);
    

    您也可以在文本框更新时使用 GetScrollPos() 来保存滚动位置:

    [DllImport("user32.dll")]
    static extern int GetScrollPos(IntPtr hWnd, int nBar);
    

    【讨论】:

    • 如果我有 1 条非常长的行,比如字节流呢?
    【解决方案2】:

    我通常这样做:

    textBox1.Select(textBox1.Text.Length, 0);
    textBox1.ScrollToCaret();
    

    选择 0 个字符只是将光标移动到所需位置(在示例代码中:文本末尾)。

    【讨论】:

      【解决方案3】:

      请尽量避免直接控制它,它只是不能很好地工作。设置 TextBox.SelectionStart 属性以确保插入符号是您要使其可见的行。然后调用 ScrollToCaret。控件必须有焦点才能完成这项工作。您的用户可以轻松找到它。

      TextBox 是控件的祖父的包装器,它已经 23 岁了,比我认为的许多 SO 用户还要老。回到当 640 KB 对每个人来说都足够的时候,Window 2.0 必须在 386SUX 或更低的速度上运行。 WPF 版本有更多的口哨声。

      【讨论】:

        猜你喜欢
        • 2015-01-25
        • 2012-01-21
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多