带有垂直滚动条的TextBox在左侧

时间:2013-01-18 15:45:02

标签: c# winforms

我正在用C#开发一个Windows窗体应用程序,它在窗体上有一个多行TextBox控件。

由于特定(不相关)的原因,此TextBox需要TextBox控件的 left 侧的垂直滚动条。我当然没有寻找解决方案,但我找不到任何......所以我的问题是:

1)有没有办法让TextBox控件的自动垂直滚动条(或者从TextBox或TextBoxBase派生的用户控件)出现在左边而不是右边?这是首选的方法,因为所有的控制仍然由控件处理。由于为这样的TextBox选择RightToLeft属性实际上将滚动条移动到左侧,我觉得必须有一个黑客可以在这里被利用。

2)当TextBox滚动时,是否有可以拦截我的IMessageFilter实现的消息,即使它没有滚动条?即用户可以使用箭头键滚动,文本框会上下移动行,但是当发生这种情况时我找不到任何消息。

或许还有另外一个如何实现这个目标的想法?

编辑添加:文本需要水平对齐 right !否则我就已经解决了。

截至2014年3月11日的新编辑:好的,在BenVlodgi的评论之后,我开始怀疑自己的理智。所以我创建了一个测试项目,现在我记得为什么将RightToLeft设置为Yes无效。

下图显示左侧的常规TextBox,并带有该设置。滚动条位于左侧,文本位于右侧,但文本显示不正确。句子末尾的句号移到句子前面。

第二个TextBox控件是LarsTech的答案中建议的控件,它可以正常运行并且不会移动任何标点符号。

Difference between the two TextBox controls

因此,我接受并奖励LarsTech的回答。

2 个答案:

答案 0 :(得分:3)

我从Rachel Gallen的链接中获取了一些示例代码并制作了TextBox的这个版本:

public class TextBoxWithScrollLeft : TextBox {
  private const int GWL_EXSTYLE = -20;
  private const int WS_EX_LEFTSCROLLBAR = 16384;

  [DllImport("user32", CharSet = CharSet.Auto)]
  public extern static int GetWindowLong(IntPtr hWnd, int nIndex);

  [DllImport("user32")]
  public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

  protected override void OnHandleCreated(EventArgs e) {
    base.OnHandleCreated(e);
    int style = GetWindowLong(Handle, GWL_EXSTYLE);
    style = style | WS_EX_LEFTSCROLLBAR;
    SetWindowLong(Handle, GWL_EXSTYLE, style);
  }
}

我以前从未这样做过,但结果似乎有效:

enter image description here

答案 1 :(得分:1)

通过将RightToLeft属性设置为true。但它说内容也是从右到左,所以我不知道这是否能解决你的问题...但这是一种在左侧设置滚动条的方法。

http://bytes.com/topic/c-sharp/answers/255138-scrollbar-position