我讨厌两个richTextBoxs
。
我有两个问题:
无论我如何定义滚动条 - 它都不是apear。如果我写的长度超过了行的长度 - 光标移到下面的行 - 我希望所有内容都写在同一行,用户可以用滚动条左右移动。
我想要一个滚动条来控制两个richtextbox。 一个水平两个,一个垂直两个。
答案 0 :(得分:2)
答案 1 :(得分:0)
解决第二个问题的最佳方法是使用GetScrollInfo和SetScrollInfo。我认为您应该能够处理HScroll
和VScroll
事件,当它们触发时,您必须在第二个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.aspx和http://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx
pinvoke.net上也有一些很好的例子(例如 GetScrollInfo)