2017-03-17 65 views
2

我有一只股票的winform的DateTimePicker,看起来像这样... winform datetimepicker的WinForms - 无边界的DateTimePicker

我想使它看起来像这样...

winform datetimepicker modified

WinFormTextBox有一个无边框选项,我手动创建了一个水平线,以给出无缝下划线TextBox的错觉,但DateTimePicker似乎没有无边框选项。

有什么我可以做的,使DateTimePicker看起来像上面的例子,或至少删除边界,所以我可以手动放置下划线?

+0

你可以继承'DateTimePicker',覆盖'OnPaint',从覆盖的方法中调用'base.OnPaint',然后在想要变白的黑色像素上绘制白色。 – adv12

+0

你需要做的是创建一个自定义的WInForm来扩展DateTimePicker的行为。这是最干净的解决方案,这里是一个教程:http://devblog.antongochev.net/2008/07/07/create-custom-ui-appearance-for-winforms-controls-part-1/ – Nico

+0

@Niko我不认为DTP允许外观定制(它是围绕Windows公共控制的包装,可以进行所有绘画等)。 –

回答

0

与代码量最少的答案将是放置一个面板,通过减小尺寸放置在面板的控制,然后“夹子”的dateTimePicker的(DTP)的边界的面板。

0

要实现控件的自定义外观,必须重写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(); 
} 
0

这是接近我可以得到它:

你必须使图像的下拉按钮。

enter image description here

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

}