2009-12-22 44 views
10

每当将RichTextBox.Enabled属性设置为false时,它的背景颜色会自动设置为灰色,因为它被设置为在控制面板中设置的系统颜色的颜色。即使将其设置为禁用,我如何将其颜色更改为黑色?如何在禁用时更改富文本框的背景颜色?

回答

11

参见:How to change the font color of a disabled TextBox?

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

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(); }; 
    } 
} 
+0

它不是我要求的东西! – Badr 2009-12-22 13:26:49

+0

@moon:是的。 – 2009-12-22 13:47:12

+3

@moon:是的,您必须将控件设置为只读,并手动设置颜色而不是禁用它。禁用控件将使用操作系统设置来呈现它。 – 2009-12-22 17:15:20

3

创建如下的自定义Richtextbox 这将生成一个带有透明Backcolor的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 
3

其晚,但它不是一个坏的方式,

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; 
    } 
3

的背景色属性设置为你想要的颜色,然后设置RichTextBox的只读到。

例:

richTextBox.BackColor = Color.White; 
richTextBox.ReadOnly = true; 
+0

不完全相同,readonly仍然允许选择,滚动等。 – 2013-03-13 21:18:50

+0

+1因为在我的情况下,当ShowSelectionMargin设置为True时,启用/禁用行为显得不可靠。 – 2014-01-25 23:02:34

4

我只是发现这样做的一个很好的方式。它应该与任何控制工作:

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); 
    } 
} 

您可以安全地设置启用=真,只读=假,它会像一个标签,防止焦点,用户输入,光标变化,而不会真正关闭。

看看它是否适合你。 问候

相关问题