2009-12-22 98 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); 
    } 
} 

您可以安全地設置啓用=真,只讀=假,它會像一個標籤,防止焦點,用戶輸入,光標變化,而不會真正關閉。

看看它是否適合你。 問候