圆角文本框边框双边框

Rounded textbox border double borders

提问人:Ozan BAYRAM 提问时间:11/6/2023 更新时间:11/6/2023 访问量:56

问:

我正在尝试创建一个带有圆角的自定义文本框控件。但不知何故,我无法覆盖默认边框并得到如下结果:

enter image description here

代码如下:

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

namespace Desktop.CustomControls
{
    public class CustomTextBox : TextBox
    {
        private const int WM_NCPAINT = 0x85;
        private const int WM_PAINT = 0xF;

        private Color borderColor = Color.FromArgb(((int)(((byte)(115)))), ((int)(((byte)(115)))), ((int)(((byte)(115)))));
        private int borderSize = 1;
        private int borderRadius = 8;

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

        public CustomTextBox()
        {
            this.BorderStyle = BorderStyle.None; // Remove the default border style
        }

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

            if (m.Msg == WM_PAINT) // WM_PAINT message
            {
                using (Graphics g = this.CreateGraphics())
                {
                    g.SmoothingMode = SmoothingMode.AntiAlias;

                    using (Pen borderPen = new Pen(borderColor, borderSize))
                    {
                        g.DrawRoundedRectangle(borderPen
                            , 0, 0, this.Width - 1, this.Height - 1
                            , borderRadius);
                    }
                }
            }
        }
    }

    public static class GraphicsExtensions
    {
        public static void DrawRoundedRectangle(this Graphics g, Pen pen, float x, float y, float width, float height, float radius)
        {
            float diameter = radius * 2;
            SizeF sizeF = new SizeF(diameter, diameter);
            RectangleF arc = new RectangleF(x, y, sizeF.Width, sizeF.Height);

            // Top-left arc
            g.DrawArc(pen, arc, 180, 90);
            // Top-right arc
            arc.X = x + width - diameter;
            g.DrawArc(pen, arc, 270, 90);
            // Bottom-right arc
            arc.Y = y + height - diameter;
            g.DrawArc(pen, arc, 0, 90);
            // Bottom-left arc
            arc.X = x;
            g.DrawArc(pen, arc, 90, 90);
        }
    }
}

我做错了什么或错过了什么?提前致谢。

C# WinForms 文本框

评论

0赞 Zohar Peled 11/6/2023
你正在覆盖(我认为这是一个错误),你做的第一件事就是称它为基础——这可能就是画边界的原因。我以前做过这种事情,现在没有代码,但我明天会有。希望我能记得发布答案。WndProcbase.WndProc(ref m);
0赞 Jimi 11/7/2023
您正在客户区内绘图。非客户区域已经绘制完成。您可以(理论上)处理和(也仔细处理调用及其几个未记录的标志)来设置一个圆形剪辑区域。还可以将 TextBox 添加到像这样绘制的 UserControl 中,并公开您关心的属性。也很痛苦,但不那么痛苦(至少,您可以轻松地消除边框的锯齿)WM_NCCALSIZEWM_NCPAINTGetDcEx()

答: 暂无答案