C# WinForms-无边界日期时间选择器
我有一个股票winform datetimepicker,看起来像这样。。。 我想让它看起来像这样C# WinForms-无边界日期时间选择器,c#,winforms,borderless,C#,Winforms,Borderless,我有一个股票winform datetimepicker,看起来像这样。。。 我想让它看起来像这样 WinFormTextBox有一个无边界选项,我手动创建了一个水平规则,给人一种无缝带下划线的TextBox的错觉,但是日期时间选择器似乎没有无边界选项 我可以做些什么来使DateTimePicker看起来像上面的示例,或者至少删除边框以便手动放置下划线?要实现控件的自定义外观,必须重写WndProc方法,该方法处理此控件的所有窗口消息 protected override void WndP
WinForm
TextBox
有一个无边界选项,我手动创建了一个水平规则,给人一种无缝带下划线的TextBox
的错觉,但是日期时间选择器
似乎没有无边界选项
我可以做些什么来使
DateTimePicker
看起来像上面的示例,或者至少删除边框以便手动放置下划线?要实现控件的自定义外观,必须重写WndProc方法,该方法处理此控件的所有窗口消息
protected override void WndProc(ref Message m)
{
IntPtr hDC = GetWindowDC(m.HWnd);
Graphics gdc = Graphics.FromHdc(hDC);
switch (m.Msg)
{
case WM_NC_PAINT:
SendMessage(this.Handle, WM_ERASEBKGND, hDC, 0);
SendPrintClientMsg();
SendMessage(this.Handle, WM_PAINT, IntPtr.Zero, 0);
OverrideControlBorder(gdc);
m.Result = (IntPtr)1; // indicate msg has been processed
break;
case WM_PAINT: base.WndProc(ref m);
OverrideControlBorder(gdc);
OverrideDropDown(gdc);
break;
case WM_NC_HITTEST:
base.WndProc(ref m);
if (DroppedDown)
this.Invalidate(this.ClientRectangle, false);
break;
default:
base.WndProc(ref m);
break;
}
ReleaseDC(m.HWnd, hDC);
gdc.Dispose();
}
这是我能得到的最接近的结果: 您必须为下拉按钮制作一个图像
代码量最少的答案是放置一个面板,将控件放置在面板中,然后通过减小面板的大小来“剪裁”日期时间选择器(DTP)的边框。您可以将
日期时间选择器
子类化,覆盖OnPaint
,从覆盖的方法中调用base.OnPaint
,然后在想要变成白色的黑色像素上画白色。你要做的是创建一个自定义WInForm扩展DateTimePicker的行为。这是最干净的解决方案,这里有一个教程:@Niko我认为DTP不允许外观定制(它是一个围绕Windows通用控件的包装器,负责所有绘制等)。您可以通过将DTP放入容器控件(面板或用户控件)并设置DTP.Left=DPT.Top=-1来“剪裁”边框,Container.Height=DTP.Height-1,Container.Width=DTP.Width-2@IvanStoev感谢您为解决方案播撒创意!最后,我将dateTimePicker(DTP)放置在面板中,然后调整面板的大小以“剪裁”边缘。
public class SexyDateTimePicker : DateTimePicker
{
public SexyDateTimePicker() : base()
{
this.SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawLine(Pens.Black, 0, this.ClientSize.Height -1, this.ClientSize.Width, this.ClientSize.Height -1);
e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(Color.Black), 0, 0);
e.Graphics.DrawImage(Properties.Resources.DateOrTimePicker_675, new Point(this.ClientRectangle.X + this.ClientRectangle.Width - 16, this.ClientRectangle.Y));
}
}