C# 左侧带有垂直滚动条的文本框
我正在用C#开发一个Windows窗体应用程序,它在窗体上有一个多行文本框控件 由于特定(不相关)原因,此文本框需要在文本框控件的左侧设置一个垂直滚动条。我已经在寻找解决方案,但我找不到任何。。。因此,我的问题是: 1) 有没有办法使TextBox控件(或从TextBox或TextBoxBase派生的usercontrol)的自动垂直滚动条显示在左侧而不是右侧?这是首选的方法,因为所有的烤焦仍然由控件处理。由于更改这样一个文本框的RightToLeft属性实际上会将滚动条向左移动,我觉得这里一定有黑客攻击 或 2) 当文本框被滚动时,我是否可以用我的IMessageFilter实现截获一条消息,即使它没有滚动条?也就是说,用户可以使用箭头键滚动,文本框会上下移动行,但在这种情况下,我找不到任何触发的消息 也许是另一个如何实现这一点的想法 编辑以添加:文本需要水平向右对齐!否则我早就解决了 2014年3月11日的新编辑:好吧,在BenVlodgi发表评论后,我开始怀疑自己的理智。所以我创建了一个测试项目,现在我想起了为什么将C# 左侧带有垂直滚动条的文本框,c#,winforms,C#,Winforms,我正在用C#开发一个Windows窗体应用程序,它在窗体上有一个多行文本框控件 由于特定(不相关)原因,此文本框需要在文本框控件的左侧设置一个垂直滚动条。我已经在寻找解决方案,但我找不到任何。。。因此,我的问题是: 1) 有没有办法使TextBox控件(或从TextBox或TextBoxBase派生的usercontrol)的自动垂直滚动条显示在左侧而不是右侧?这是首选的方法,因为所有的烤焦仍然由控件处理。由于更改这样一个文本框的RightToLeft属性实际上会将滚动条向左移动,我觉得这里一定
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
,实际上可以完成这两项任务。也许你的意思是说你希望文本水平地向左对齐。非常感谢!这正是我需要的!一旦赏金允许我,我会马上给它。再次感谢!非常感谢你!这正是我需要的!一旦赏金允许我,我会马上给它。再次感谢!