C#中滚动条的两个问题

时间:2010-11-25 11:16:00

标签: c# richtextbox

我讨厌两个richTextBoxs

我有两个问题:

  1. 无论我如何定义滚动条 - 它都不是apear。如果我写的长度超过了行的长度 - 光标移到下面的行 - 我希望所有内容都写在同一行,用户可以用滚动条左右移动。

  2. 我想要一个滚动条来控制两个richtextbox。 一个水平两个,一个垂直两个。

2 个答案:

答案 0 :(得分:2)

  1. 如果您只想要一行,则需要将MultiLine属性设置为false(RichTextBoxes的默认值为true),否则将WordWrap属性设置为false(这也默认为真)。
  2. 我猜您需要处理每个RichTextBox的HScrollVScroll事件,并且在事件处理程序中滚动其他文本框的数量相同。不知道这会有多容易,但是......

答案 1 :(得分:0)

解决第二个问题的最佳方法是使用GetScrollInfo和SetScrollInfo。我认为您应该能够处理HScrollVScroll事件,当它们触发时,您必须在第二个RichTextBox中设置新的ScrollInfo。

你也需要WM_SendMessage来完成这项工作。 (所有可用的导入 User32.dll

通常的工作:

用户滚动(Scrollevents)时获取通知,并将新ScrollInfo设置为第二个RichTextBox。设置ScrollInfo后,您需要向滚动条/控件发送消息以滚动。

首先,您需要“自己的”SCROLLINFO struct

[StructLayout(LayoutKind.Sequential)]
    struct SCROLLINFO
    {
        public uint cbSize;
        public uint fMask;
        public int nMin;
        public int nMax;
        public uint nPage;
        public int nPos;
        public int nTrackPos;
    }

然后在第一个TextBox中的ScrollingEvent中获取Scrollinfo:

GetScrollInfo(this.Handle, SB_VERT, ref _si);

(其中_si是您的SCROLLINFO实例)。然后将消息发送到滚动条

    _si.nPos = 0815; //Your wanted new ScrollbarPosition (I think you can use the value of the first Scrollbar)
                //// Reposition scroller
                SetScrollInfo(Handle, SB_VERT, ref _si, true);

                //// Send a WM_VSCROLL scroll message using SB_THUMBTRACK as wParam
                //// SB_THUMBTRACK: low-order word of wParam, si.nPos high-order word of  wParam

                IntPtr ptrWparam = new IntPtr(SB_THUMBTRACK + 0x10000 * _si.nPos);
                IntPtr ptrLparam = new IntPtr(0);
                SendMessage(Handle, WM_VSCROLL, ptrWparam, ptrLparam);     

其中HANDLE是必须滚动的RichTextBox的句柄 - 您可以随时使用

获取句柄
RichTextBox.Handle

您应该真正了解http://msdn.microsoft.com/en-us/library/bb787537%28VS.85%29.aspxhttp://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx

pinvoke.net上也有一些很好的例子(例如 GetScrollInfo