2017-03-17 82 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)); 
    } 

}