如何通过C#中的代码向下滚动文本框
我正在使用winforms,我偶尔会更新一个文本框(显示消息)。 但是,当文本到达框的末尾时,它会生成滚动条,我不知道如何向下滚动到底部。 我唯一看到的是ScrollToCaret,但是Caret正处于文本的开头。 滚动的命令是什么?
您可以通过使用名为ScrollToCaret的函数来完成此操作。 您需要先将插入符号位置设置到文本框的末尾,然后滚动到该文本框。 这是怎么做的:
//move the caret to the end of the text textBox.SelectionStart = textBox.TextLength; //scroll to the caret textBox.ScrollToCaret();
这是一个古老的问题,但没有一个建议的答案对我有用(ScrollToCaret()仅在TextBox具有焦点时才有效)。 所以如果在某些时候还有更多人应该搜索这个,我想我会分享我发现的解决方案:
public class Utils { [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); private const int WM_VSCROLL = 0x115; private const int SB_BOTTOM = 7; /// /// Scrolls the vertical scroll bar of a multi-line text box to the bottom. /// /// The text box to scroll public static void ScrollToBottom(TextBox tb) { SendMessage(tb.Handle, WM_VSCROLL, (IntPtr)SB_BOTTOM, IntPtr.Zero); } }
该解决方案应该在bytes.com上发布: http ://bytes.com/topic/c-sharp/answers/248500-scroll-bottom-textbox#post1005377
如果使用文本框的AppendText()方法,则文本将添加到任何现有文本的底部,控件将滚动以显示它。
您需要在文本末尾设置插入符号:
textBox1.Text += "your new text"; textBox1.Select(textBox1.Text.Length - 1, 0); textBox1.ScrollToCaret();
C#使用Windows API向上/向下滚动(user32.dll)
首先,我们必须定义一个常量值:
const int EM_LINESCROLL = 0x00B6; const int SB_HORZ = 0; const int SB_VERT = 1;
然后,我们必须声明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,SB_VERT,myTextBox.Lines.Length-1,true); SendMessage(myTextBox.Handle,EM_LINESCROLL,0,myTextBox.Lines.Length-1);
完成! 简单易行! 经测试! 原帖
您可以使用SetScrollPos API:
[DllImport("user32.dll")] static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); [DllImport("user32.dll")] static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos); const int SB_HORZ = 0; const int SB_VERT = 1; const int SB_CTL = 2; ... void ScrollToBottom(Control ctl) { int min; int max; if (GetScrollRange(ctl.Handle, SB_VERT, out min, out max)) { SetScrollPos(ctl.Handle, SB_VERT, max, true); } }
(另)
在搜索并且从未找到合法的解决方案,无论是否有焦点以及水平和垂直方式,我偶然发现了一个有效的API解决方案(至少对我的平台来说 – Win7 / .Net4 WinForms)。
using System; using System.Runtime.InteropServices; namespace WindowsNative { /// /// Provides scroll commands for things like Multiline Textboxes, UserControls, etc. /// public static class ScrollAPIs { [DllImport("user32.dll")] internal static extern int GetScrollPos(IntPtr hWnd, int nBar); [DllImport("user32.dll")] internal static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw); [DllImport("user32.dll")] internal static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); public enum ScrollbarDirection { Horizontal = 0, Vertical = 1, } private enum Messages { WM_HSCROLL = 0x0114, WM_VSCROLL = 0x0115 } public static int GetScrollPosition(IntPtr hWnd, ScrollbarDirection direction) { return GetScrollPos(hWnd, (int)direction); } public static void GetScrollPosition(IntPtr hWnd, out int horizontalPosition, out int verticalPosition) { horizontalPosition = GetScrollPos(hWnd, (int)ScrollbarDirection.Horizontal); verticalPosition = GetScrollPos(hWnd, (int)ScrollbarDirection.Vertical); } public static void SetScrollPosition(IntPtr hwnd, int hozizontalPosition, int verticalPosition) { SetScrollPosition(hwnd, ScrollbarDirection.Horizontal, hozizontalPosition); SetScrollPosition(hwnd, ScrollbarDirection.Vertical, verticalPosition); } public static void SetScrollPosition(IntPtr hwnd, ScrollbarDirection direction, int position) { //move the scroll bar SetScrollPos(hwnd, (int)direction, position, true); //convert the position to the windows message equivalent IntPtr msgPosition = new IntPtr((position << 16) + 4); Messages msg = (direction == ScrollbarDirection.Horizontal) ? Messages.WM_HSCROLL : Messages.WM_VSCROLL; SendMessage(hwnd, (int)msg, msgPosition, IntPtr.Zero); } } }
使用多行文本框(tbx_main),使用如下:
上述就是C#学习教程:如何通过C#中的代码向下滚动文本框分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
int horzPos, vertPos; ScrollAPIs.GetScrollPosition(tbx_main.Handle, out horzPos, out vertPos); //make your changes //something like the following where m_buffer is a string[] tbx_main.Text = string.Join(Environment.NewLine, m_buffer); tbx_main.SelectionStart = 0; tbx_main.SelectionLength = 0; ScrollAPIs.SetScrollPosition(tbx_main.Handle, horzPos, vertPos);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1013895.html