带有底部边框的TextBox

我希望TextBox具有底部边框,但由于Color.TransparentTextBox绘制的图形在resize时会扭曲/损坏。

使用我发现的代码,我能够创建一个带下划线的TextBox(带有透明顶部,左侧,右侧的绘制矩形)。 问题是当我调整窗体/窗口的大小时:当我将其调整为较小,然后再次resize以扩展它时,绘制的图形会失真。 对此有任何修复?

这是照片: 第二张照片已经调整得更小,然后又回到更大的尺寸。 正常 签约然后膨胀

这是代码:

 [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时如何防止“闪烁/撕裂”?

要使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 }); } }