2

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

由于特定(不相关)的原因,这个 TextBox 需要在 TextBox 控件的左侧有一个垂直滚动条。我当然已经在寻找解决方案,但找不到任何解决方案……所以我的问题是:

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

或者

2) 是否有一条消息可以在 TextBox 滚动时通过 IMessageFilter 实现拦截,即使它没有滚动条?即用户可以使用箭头键滚动,文本框将上下移动行,但我找不到任何消息发生时触发。

也许另一个想法如何做到这一点?

编辑添加:文本需要水平向右对齐!否则我早就解决了。

2014 年 3 月 11 日的新编辑:好的,在 BenVlodgi 发表评论后,我开始怀疑自己的理智。所以我创建了一个测试项目,现在我记得为什么设置RightToLeftYes不起作用。

下图在左侧显示了具有该设置的常规文本框。滚动条在左侧,文本在右侧,但文本显示不正确。句末句号移到句前。

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

两个 TextBox 控件之间的区别

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

4

2 回答 2

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);
  }
}

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

在此处输入图像描述

于 2014-03-10T15:12:51.040 回答
1

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

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

于 2013-01-19T06:28:56.887 回答