我正在用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的答案中建议的控件,它可以正常运行并且不会移动任何标点符号。
因此,我接受并奖励LarsTech的回答。
答案 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);
}
}
我以前从未这样做过,但结果似乎有效:
答案 1 :(得分:1)
通过将RightToLeft属性设置为true。但它说内容也是从右到左,所以我不知道这是否能解决你的问题...但这是一种在左侧设置滚动条的方法。
http://bytes.com/topic/c-sharp/answers/255138-scrollbar-position