簡體   English   中英

C#RichTextBox邊框顏色

[英]c# RichTextBox Border Color

我正在嘗試使用邊框顏色創建自定義RichTextBox ,但是我遇到了問題...我的邊框顏色未顯示

這是我的代碼:

public partial class AlXRichTextBox : RichTextBox
{
    private RichTextBox textBox;

    private Color borderColor;

    public AlXRichTextBox()
    {
        InitializeComponent();
    }
    public Color BorderColor
    {
        get { return borderColor; }
        set { borderColor = value; Invalidate(); }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Pen p = new Pen(borderColor);
        Graphics g = e.Graphics;
        int variance = 3;
        //g.DrawRectangle(p, new Rectangle(base.Location.X - variance, base.Location.Y - variance, base.Width + variance, base.Height + variance));
        ControlPaint.DrawBorder(e.Graphics, base.ClientRectangle, borderColor, ButtonBorderStyle.Solid);
    }

    private void InitializeComponent()
    {
            this.textBox = new System.Windows.Forms.RichTextBox();
            this.SuspendLayout();
            // 
            // richTextBox1
            // 
            this.textBox.Location = new System.Drawing.Point(0, 0);
            this.textBox.Name = "richTextBox1";
            this.textBox.Size = new System.Drawing.Size(100, 96);
            this.textBox.TabIndex = 0;
            this.textBox.Text = "";
            this.textBox.Multiline = true;
            this.textBox.BorderStyle = BorderStyle.None;
            // 
            // AlXRichTextBox
            // 
            this.Size = new System.Drawing.Size(278, 123);
            this.ResumeLayout(false);
    }
}

這是什么問題?

參考MSDN文章

覆蓋OnPaint將不允許您修改所有控件的外觀。 那些由Windows完成繪制的控件(例如TextBox)從不調用其OnPaint方法,因此將永遠不會使用自定義代碼。 請參閱幫助文檔以了解要修改的特定控件,以查看OnPaint方法是否可用。 有關所有Windows窗體控件的列表,請參見Windows窗體上使用的控件。 如果控件未將OnPaint列為成員方法,則不能通過重寫此方法來更改其外觀。 有關自定義繪畫的更多信息,請參見自定義控件繪畫和渲染。

但是有一個“ hack”,您可以通過調用以下代碼來實現調用Paint方法:

 private const int WM_PAINT = 15;
 protected override void WndProc(ref System.Windows.Forms.Message m)
 {
     base.WndProc(ref m);
     if (m.Msg == WM_PAINT && !inhibitPaint)
     {
         // raise the paint event
         using (Graphics graphic = base.CreateGraphics())
             OnPaint(new PaintEventArgs(graphic,
             base.ClientRectangle));
     }
  }

  private bool inhibitPaint = false;

  public bool InhibitPaint
  {
      set { inhibitPaint = value; }
  }

Src: RichTextBox和UserPaint

另一點是,您不能在Rectangle(RichTB組件的總大小)之外繪制。因此,您實際上想為他提供不同的Coords(較小的內部Coords),因此您將繪制到外部。

您的課程如下所示:

public partial class AlXRichTextBox : RichTextBox
{
    private Color borderColor = Color.Red;

    public Color BorderColor
    {
        get { return borderColor; }
        set { borderColor = value; Invalidate(); }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        int variance = 3;
        e = new PaintEventArgs(e.Graphics, new Rectangle(e.ClipRectangle.X + variance, e.ClipRectangle.Y + variance, e.ClipRectangle.Width - variance, e.ClipRectangle.Height - variance));
        base.OnPaint(e);

        Pen p = new Pen(borderColor, variance);
        Graphics g = e.Graphics;
        g.DrawRectangle(p, new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width, e.ClipRectangle.Height));
    }


    private const int WM_PAINT = 15;
    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT && !inhibitPaint)
        {
            // raise the paint event
            using (Graphics graphic = base.CreateGraphics())
                OnPaint(new PaintEventArgs(graphic,
                 base.ClientRectangle));
        }

    }

    private bool inhibitPaint = false;

    public bool InhibitPaint
    {
        set { inhibitPaint = value; }
    }
}

重要

由於不希望通過Paint更改此控件,因此在諸如邊框,新元素等圖形更改方面,您將獲得“不好”的行為。如果您想使用此類元素,請考慮使用WPF-Windows演講基金會 它們對於模板項目和修改設計要好得多。

答案有點晚了,但是這些天我和你走的路是一樣的,這使我有了解決方案,它對我有用:

using System;
using System.Drawing;
using System.Windows.Forms;

public class MyRichTextBox : RichTextBox
{
    private const UInt32 WM_PAINT = 0x000F;
    private const UInt32 WM_USER = 0x0400;
    private const UInt32 EM_SETBKGNDCOLOR = (WM_USER + 67);
    private const UInt32 WM_KILLFOCUS = 0x0008;

    public MyRichTextBox()
    {
        this.BorderStyle = System.Windows.Forms.BorderStyle.None;
    }

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        base.WndProc(ref m);

        Graphics g = Graphics.FromHwnd(Handle);
        Rectangle bounds = new Rectangle(0, 0, Width - 1, Height - 1);
        Pen p = new Pen(SystemColors.Highlight, 3);

        if (m.Msg == WM_PAINT)
        {
            if (this.Enabled == true)
            {

                if (this.Focused)
                {
                    g.DrawRectangle(p, bounds);
                }

                else
                {
                    g.DrawRectangle(SystemPens.ControlDark, bounds);
                }

            }
            else
            {
                g.FillRectangle(Brushes.White, bounds);
                g.DrawRectangle(SystemPens.Control, bounds);
            }
        }

        if (m.Msg == EM_SETBKGNDCOLOR) //color disabled background
        {
            Invalidate();
        }

        if (m.Msg == WM_KILLFOCUS) //set border back to normal on lost focus
        {
            Invalidate();
        }
    }

}

此Rich Textbox更改3種邊框顏色-啟用,聚焦和禁用背景禁用。 如您所見,代碼簡單而簡短。 唯一的技巧是覆蓋KILL_FOCUS和EM_SETBKGNDCOLOR消息(此消息用於更改禁用的背景),並且RichTextbox應該為BorderStyle = None。 干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM