【问题标题】:How to change the background color of a rich text box when it is disabled?禁用时如何更改富文本框的背景颜色?
【发布时间】:2010-12-29 02:28:37
【问题描述】:

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

【问题讨论】:

    标签: c# .net winforms richtextbox


    【解决方案1】:

    我刚刚找到了一个很好的方法。它应该适用于任何控件:

    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,它会像一个标签一样,防止焦点、用户输入、光标更改,而不会被实际禁用。

    看看它是否适合你。 问候

    【讨论】:

    • 其他答案会产生挑剔的结果。
    【解决方案2】:

    将backcolor属性设置为你想要的颜色,然后将richtextbox设置为只读。

    例如:

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

    【讨论】:

    • 不太一样,只读仍然允许选择、滚动等。
    • +1 因为在我的情况下,当 ShowSelectionMargin 设置为 True 时,启用/禁用行为似乎不可靠。
    【解决方案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;
        }
    

    【讨论】:

    • 问题是关于禁用richTextBox控件,而不是将其设置为只读控件。
    【解决方案4】:

    如下创建自定义富文本框 这将产生一个带有透明背景色的 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
    

    【讨论】:

      【解决方案5】:

      见: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(); };
          }
      }
      

      【讨论】:

      • 这不是我想要的!
      • @moon:是的,您必须将控件设置为只读并手动设置颜色,而不是禁用它。禁用控件将使用操作系统设置来确定其呈现方式。
      • 先生。 Mikael Svenson 如果我将其设置为只读,它会显示光标,并且还可以复制我想在文本上查看的数据,但其他选项不应该存在,我使用标签,但如果存在动态调整大小的问题有一些选项可以隐藏光标并且没有复制粘贴选项然后它可以工作我已经通过处置光标来控制复制粘贴选项但是ibeam仍然闪烁如果可以处理我的问题将得到解决等待回复!
      • 添加了代码示例,说明如何使其工作以使光标不会闪烁。
      • 只是提醒未来的读者,您仍然可以在文本框中看到胡萝卜,这取决于将背景设置为与胡萝卜相同的颜色来隐藏它。如果您更改了颜色,您将在鼠标指针周围看到胡萝卜的奇怪工件。
      【解决方案6】:

      看看DrawStringDisabled Method。您必须覆盖 OnPaint 方法,然后使用 DrawStringDisabled 方法。但是,如果我在你的位置,那么我会选择Mikael Svenson's 回答。

      【讨论】:

        猜你喜欢
        • 2013-05-20
        • 2013-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2010-11-16
        相关资源
        最近更新 更多