当富文本框被禁用时如何更改其背景颜色?

17
无论何时我将 RichTextBox.Enabled 属性设置为 false,它的背景颜色都会自动设置为灰色,因为它被设置为在控制面板中设置的系统颜色。即使我将其设置为禁用状态,我该如何将其颜色更改为黑色?
6个回答

16

参见:如何更改已禁用的文本框的字体颜色?

[编辑 - 添加了代码示例]

richTextBox.TabStop = false;
richTextBox.ReadOnly = true;
richTextBox.BackColor = Color.DimGray;
richTextBox.Cursor = Cursors.Arrow;
richTextBox.Enter += richTextBox_Enter;

private void richTextBox_Enter(object sender, EventArgs e)
{
    // you need to set the focus somewhere else. Eg a label.
    SomeOtherControl.Focus();
}

或者作为扩展方法(我意识到您不必将其放在只读中,因为Enter事件会捕获任何输入):

public static class MyExtensions
{
    public static void Disable( this Control control, Control focusTarget )
    {
        control.TabStop = false;
        control.BackColor = Color.DimGray;
        control.Cursor = Cursors.Arrow;
        control.Enter += delegate { focusTarget.Focus(); };
    }
}

这不是我要求的东西! - Badr
3
@moon:是的,你需要将控件设置为只读,并手动设置颜色,而不是禁用它。禁用控件将使用操作系统设置来呈现它。 - Mikael Svenson
先生,如果我将它设置为只读,它会显示光标,并且可以复制数据。我想要给它一个文本的外观,但其他选项不应该存在。我使用标签,但在动态调整大小时存在问题。如果有一些选项可以隐藏光标和禁止复制黏贴,则可以解决问题。我通过释放光标来控制复制黏贴选项,但是光标仍在闪烁。如何处理它?如果可以处理我的问题就会解决。等待回复! - Badr
添加了代码示例,以说明如何使光标不闪烁。 - Mikael Svenson
未来的读者请注意,文本框中仍然可见插入符号,并且它取决于将背景设置为与插入符号相同的颜色以隐藏它。如果您更改了颜色,您将得到插入符号跟随鼠标指针移动的奇怪现象。 - denver

8

我刚刚找到了一种很好的方法来做这件事。它应该可以与任何控件一起使用:

public class DisabledRichTextBox : System.Windows.Forms.RichTextBox
{
    // See: http://wiki.winehq.org/List_Of_Windows_Messages

    private const int WM_SETFOCUS   = 0x07;
    private const int WM_ENABLE     = 0x0A;
    private const int WM_SETCURSOR  = 0x20;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (!(m.Msg == WM_SETFOCUS || m.Msg == WM_ENABLE || m.Msg == WM_SETCURSOR))
            base.WndProc(ref m);
    }
}

你可以安全地将Enabled设置为true,将ReadOnly设置为false,它会像标签一样工作,防止焦点、用户输入、光标改变,而不会实际禁用。
看看它是否适合你。 问候

其他答案会产生棘手的结果。 - denver

4
将Backcolor属性设置为所需颜色,然后将RichTextBox设置为只读模式。
例如:
richTextBox.BackColor = Color.White;
richTextBox.ReadOnly = true; 

不完全相同,readonly 仍允许选择、滚动等操作。 - Adam K Dean
+1 是因为在我的情况下,当 ShowSelectionMargin 设置为 True 时,启用/禁用行为似乎不可靠。 - Jon Coombs

3
创建一个自定义的Richtextbox如下所示,这将产生一个具有透明背景色的Richtextbox。然后,您可以将此控件放置在颜色相配的面板上。
Public Class MyRichTextBox
Inherits RichTextBox
<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr
End Function
Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams
    Get
        Dim prams As CreateParams = MyBase.CreateParams
        If LoadLibrary("msftedit.dll") <> IntPtr.Zero Then
            prams.ExStyle = prams.ExStyle Or &H20 'Makes Transparent
            prams.ClassName = "RICHEDIT50W"
        End If
        Return prams
    End Get
End Property

2

虽然已经晚了,但并不是一件坏事,

    private void richTextBox1_ReadOnlyChanged(object sender, EventArgs e)
    {
        //just here instead of White select your color

        richTextBox1.BackColor = Color.White;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        richTextBox1.ReadOnly = true;
    }

问题是关于禁用richTextBox控件,而不是将其设置为只读控件。 - musicinmusic

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接