带底边框的文本框

问题描述 投票:0回答:2

我想要

TextBox
带有底部边框,但由于
TextBox
,为
Color.Transparent
绘制的图形在调整大小时会扭曲/损坏。

使用我找到的代码,我能够创建一个带下划线的文本框(具有透明顶部、左侧、右侧的绘制矩形)。问题是当我调整表单/窗口的大小时:当我将其调整为较小,然后再次调整大小以展开它时,绘制的图形会变形。 有什么解决办法吗?

这里是照片:第二张照片已经缩小,然后又恢复到更大的尺寸。

这是代码:

[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);
    }


编辑:

我已经发现了这个问题,这是因为
Color.Transparent
我通过将其更改为Color.White来修复它,因为我有白色背景。但情况并非总是如此,在使用 Color.Transparent 时如何防止“闪烁/撕裂”?

c# winforms user-interface graphics window-resize
2个回答
11
投票

要拥有带有底部边框的

TextBox
,我可以提供的最简单的解决方法是将 1 像素高度的标签(或其他控件)停靠在
TextBox
的底部:

using System.Drawing;
using System.Windows.Forms;
public class MyTextBox : TextBox
{
    public MyTextBox()
    {
        BorderStyle = System.Windows.Forms.BorderStyle.None;
        AutoSize = false; //Allows you to change height to have bottom padding
        Controls.Add(new Label()
                    { Height = 1, Dock = DockStyle.Bottom, BackColor = Color.Black });
    }
}

0
投票

this.TxtBox.BorderStyle = System.Windows.Forms.BorderStyle.None;

© www.soinside.com 2019 - 2024. All rights reserved.