C# 左侧带有垂直滚动条的文本框

C# 左侧带有垂直滚动条的文本框,c#,winforms,C#,Winforms,我正在用C#开发一个Windows窗体应用程序,它在窗体上有一个多行文本框控件 由于特定(不相关)原因,此文本框需要在文本框控件的左侧设置一个垂直滚动条。我已经在寻找解决方案,但我找不到任何。。。因此,我的问题是: 1) 有没有办法使TextBox控件(或从TextBox或TextBoxBase派生的usercontrol)的自动垂直滚动条显示在左侧而不是右侧?这是首选的方法,因为所有的烤焦仍然由控件处理。由于更改这样一个文本框的RightToLeft属性实际上会将滚动条向左移动,我觉得这里一定

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

由于特定(不相关)原因,此文本框需要在文本框控件的左侧设置一个垂直滚动条。我已经在寻找解决方案,但我找不到任何。。。因此,我的问题是:

1) 有没有办法使TextBox控件(或从TextBox或TextBoxBase派生的usercontrol)的自动垂直滚动条显示在左侧而不是右侧?这是首选的方法,因为所有的烤焦仍然由控件处理。由于更改这样一个文本框的RightToLeft属性实际上会将滚动条向左移动,我觉得这里一定有黑客攻击

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

也许是另一个如何实现这一点的想法

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

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

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

第二个文本框控件是LarsTech的答案中建议的控件,它功能正确,不移动任何标点符号


因此,我接受并奖励对LarsTech答案的赏金。

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


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


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

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);
  }
}
我以前从未做过,但结果似乎很有效:


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

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);
  }
}
我以前从未做过,但结果似乎很有效:


从内存中,如果将
LeftToRight
设置为Yes,并且
textalAlign=HorizontalAlign.Right
设置为文本,会发生什么?是的,我已经尝试过了,但是文本从右向左(向后)流动,这不是我想要的。谢谢Rachel,我会仔细看看。似乎我可以修改该代码以使用文本框。@JohnWillemse你说的
文本需要水平向右对齐
这是由任何打字错误造成的。将RightToLeft属性设置为
RightToLeft.Yes
,实际上可以完成这两项任务。也许您的意思是希望文本水平向左对齐。从内存中,如果您将
LeftToRight
设置为Yes,并且
textalAlign=HorizontalAlign.Right
对于文本,会发生什么情况?是的,我已经尝试过了,但是文本从右向左(向后)流动,这不是我想要的。请参阅,谢谢Rachel,我会仔细看看。似乎我可以修改该代码以使用文本框。@JohnWillemse你说的
文本需要水平向右对齐
这是由任何打字错误造成的。将RightToLeft属性设置为
RightToLeft.Yes
,实际上可以完成这两项任务。也许你的意思是说你希望文本水平地向左对齐。非常感谢!这正是我需要的!一旦赏金允许我,我会马上给它。再次感谢!非常感谢你!这正是我需要的!一旦赏金允许我,我会马上给它。再次感谢!