阻止能够在C#窗体中突出显示文本框中的文本的能力

时间:2010-12-07 06:16:07

标签: c# winforms textbox highlighting

我想在C#中创建一个带有文本框的Windows窗体,其文本无法由用户更改或选择。 我设法让它不可改变(ReadOnly = true),但我仍然能够选择并突出显示文本。

我该如何更改?

谢谢!

-R

3 个答案:

答案 0 :(得分:1)

这是预期的行为,是设计使然。如果右键单击Windows资源管理器中的项目并打开其“属性”窗口,则可以自行查看。 “常规”选项卡上的所有动态文本字段都是可选的,但不可修改。 如果这不是您想要的行为,则应强烈考虑使用Label control这是用户无法选择的静态文本的确切情况。

如果由于某种原因,您没有出售为什么您应该使用Label控件,我会继续回答您提出的问题。 尝试覆盖此行为的主要问题(如覆盖任何控件的默认行为) lot 用户完成它的方法:用鼠标单击并拖动,双击鼠标按钮,使用键盘上的箭头键和 Shift 键,选中文本框,右键单击并从上下文菜单中选择“全选”等等。

您的第一直觉可能是覆盖.NET Framework公开的潜在相关事件(例如OnMouseDownOnKeyDown等)并将所选长度重置为0,以便文本为自动选择后立即取消选择。但是,这会在此过程中产生一点点闪烁效果,这可能是您可能接受的,也可能是不可接受的。

或者,你可以通过覆盖控件的WndProc方法,观察相关的窗口消息,并防止消息完全传递给控件的基类来做同样的事情。这样可以防止闪烁效应,因为基本TextBox控件实际上从未接收到导致其自动选择其文本的消息,但它确实具有阻止控件因这些常见操作而采取任何操作的明显副作用事件。在这种情况下,似乎对你来说可能并不重要,但要意识到这仍然是一个非常激烈的黑客攻击。我绝对不能推荐它作为良好的做法。

话虽如此,如果您仍然感兴趣,可以使用以下自定义UnselectableTextBox课程。它阻止了我能想到的每个窗口消息的处理,这可能允许用户选择文本。它确实有效,但是公平警告:可能还有其他我没有想过的。

public class UnselectableTextBox : TextBox
{
    public UnselectableTextBox() : base()
    {
        //Set it to read only by default
        this.ReadOnly = true;
    }

    protected override void OnGotFocus(System.EventArgs e)
    {
        base.OnGotFocus(e);

        //Prevent contents from being selected initally on focus
        this.DeselectAll();
    }

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        const int WM_KEYDOWN = 0x100;
        const int WM_LBUTTONDOWN = 0x201;
        const int WM_LBUTTONDBLCLK = 0x203;
        const int WM_RBUTTONDOWN = 0x204;

        if ((m.Msg == WM_KEYDOWN) || (m.Msg == WM_LBUTTONDOWN) ||
            (m.Msg == WM_LBUTTONDBLCLK) || (m.Msg == WM_RBUTTONDOWN))
        {
            this.DeselectAll();
            return;
        }

        base.WndProc(ref m);
    }
}

答案 1 :(得分:0)

禁用它是一种选择吗? (已启用= false)

答案 2 :(得分:0)

使用label取代textbox。我认为您只想显示信息,而不是选择,而不是复制,使用label将是更好的选择......

相关问题