【问题标题】:TextBox with vertical scrollbar on the left side左侧带有垂直滚动条的文本框
【发布时间】:2013-01-18 15:45:02
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 根据记忆,如果您将LeftToRight 设置为是,并将TextAlign=HorizontalAlign.Right 设置为文本,会发生什么?
  • 是的,我试过了,但是文本从右到左(向后)流动,这不是我想要的。
  • 谢谢瑞秋,我会仔细看看。看来我可以修改该代码以使用文本框。
  • @JohnWillemse 你说The text needs to be aligned to the right horizontally 这是任何改变一个错字。将 RightToLeft 属性设置为 RightToLeft.Yes,实际上完成了这两项任务。也许你的意思是说你希望文本水平对齐到左边。

标签: c# winforms


【解决方案1】:

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

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

【讨论】:

  • 非常感谢!这正是我所需要的!我会尽快奖励赏金。再次感谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多