2013-01-18 57 views
2

我正在开发一个C#中的Windows窗体应用程序,它在窗体上有一个多行TextBox控件。在左侧有垂直滚动条的文本框

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

1)有没有办法让一个TextBox控件的自动垂直滚动条(或一个用户控件派生从TextBox或TextBoxBase)出现在左侧而不是右侧?这是首选的方法,因为所有的结果都由控件处理。由于对这样一个TextBox的RightToLeft属性进行切换实际上会将滚动条移动到左侧,所以我觉得这里必须有一个黑客入侵。

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

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

修改添加:文本需要水平对齐右边!否则,我已经解决了它。

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

下图显示了使用该设置的左侧的常规文本框。滚动条位于左侧,文本位于右侧,但文本显示不正确。句子结尾的句点移到句子前面。

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

Difference between the two TextBox controls

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

+0

从内存中,如果你设置'LeftToRight'为是,和'textAlign设置= Horizo​​ntalAlign.Right'的,发生了什么文字? – dash

+0

是的,我试过了,但是文本从右向左流动(向后),这不是我想要的。 –

+1

参见http://stackoverflow.com/questions/8003530/is-it-possible-to-define-a-left-handed-combobox-ie-scrollbar-on-the-left-in-a –

回答

3

我花了一些来自雷切尔圣加伦的链接的示例代码和制作这个版本的文本框的:

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

+0

非常感谢!那正是我需要的!我会尽快给予奖励。再次感谢! –