Cuadro de texto con borde inferior

quiero tenerTextBox con borde inferior pero gráficos dibujados paraTextBox está distorsionado / roto al cambiar el tamaño debido aColor.Transparent.

Utilizando un código que encontré, pude crear un TextBox subrayado (Rectángulo dibujado con parte superior transparente, izquierda, derecha). El problema es cuando cambio el tamaño del formulario / ventana: cuando lo cambio a un tamaño más pequeño, luego lo cambio nuevamente para expandirlo, los gráficos dibujados se distorsionan.¿Alguna solución para esto?

Aquí hay fotos:La segunda foto ya ha sido redimensionada más pequeña, luego de vuelta a un tamaño más grande.

Aquí está el código:

[DllImport("user32")]
    private static extern IntPtr GetWindowDC(IntPtr hwnd);
    struct RECT {
        public int left, top, right, bottom;
    }
    struct NCCALSIZE_PARAMS {
        public RECT newWindow;
        public RECT oldWindow;
        public RECT clientWindow;
        IntPtr windowPos;
    }

    float clientPadding = 0;
    int actualBorderWidth = 2;
    Color borderColor = Color.Black;
    protected override void WndProc(ref Message m) {
        //We have to change the clientsize to make room for borders
        //if not, the border is limited in how thick it is.
        if (m.Msg == 0x83) { //WM_NCCALCSIZE 
            if (m.WParam == IntPtr.Zero) {
                RECT rect = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
                rect.left += 2;
                rect.right -= 2;
                rect.top += 0;
                rect.bottom -= 0;// (int)clientPadding;
                Marshal.StructureToPtr(rect, m.LParam, false);
            } else {
                NCCALSIZE_PARAMS rects = (NCCALSIZE_PARAMS)Marshal.PtrToStructure(m.LParam, typeof(NCCALSIZE_PARAMS));
                rects.newWindow.left += (int)clientPadding;
                rects.newWindow.right -= (int)clientPadding;
                rects.newWindow.top += (int)clientPadding;
                rects.newWindow.bottom -= 2;
                Marshal.StructureToPtr(rects, m.LParam, false);
            }
        }
        if (m.Msg == 0x85) {//WM_NCPAINT    
            IntPtr wDC = GetWindowDC(Handle);
            using (Graphics g = Graphics.FromHdc(wDC)) {
                ControlPaint.DrawBorder(g, new Rectangle(0, 0, Size.Width, Size.Height),
                    Color.Transparent, 1, ButtonBorderStyle.Solid,
                    Color.Transparent, 1, ButtonBorderStyle.Solid,
                    Color.Transparent, 1, ButtonBorderStyle.Solid,
                    borderColor, actualBorderWidth, ButtonBorderStyle.Solid);
            }
            return;
        }
        base.WndProc(ref m);
    }


EDITAR:Ya encontré el problema, es por elColor.Transparent Lo arreglé cambiándolo a Color. Blanco, ya que tengo un fondo blanco. Pero entonces, ese no siempre sería el caso,¿Cómo podría evitar ese "parpadeo / desgarro" mientras uso Color.Transparent?

Respuestas a la pregunta(1)

Su respuesta a la pregunta