C# DateTimePicker change MonthCalendar
本文关键字:MonthCalendar change DateTimePicker | 更新日期: 2023-09-27 18:05:44
我创建了自己的MonthCalendar(选择多个内容和更多更改),我想将其与DateTimePicker一起使用。拿DateTimePicker,当点击右键,然后它显示我的自定义日历。有简单的方法吗?或者我应该像本教程中那样自己创建:http://www.techpowerup.com/forums/showthread.php?t=70925由于
这是一个小技巧,但应该可以正常工作。
首先我们在onsizechange检查我们有什么按钮,大(带图标)或小(没有图标)。如果是大按钮,则按钮的宽度为35像素,小按钮的宽度为18像素。
然后我们听窗口消息。如果鼠标按下,我们检查用户单击的位置。因此,我们将lParam转换为X/Y位置。如果X位置在按钮区域,我们转到自定义方法并显示日历。在我们从方法返回的方法之后,DateTimePicker也会显示它自己的日历。
另外,我们重写ShowUpDown属性并将其设置为Browseable(false)。但是我们也可以检查ShowUpDown是否为真并让DateTimePcker处理点击。
代码如下:
class DateTimePickerEX : DateTimePicker {
const int WM_MOUSEDOWN = 0x201;
int paddingright = 0;
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
int textwidth = 0;
using (Graphics g = this.CreateGraphics()) {
textwidth = (int)g.MeasureString(this.Text, this.Font).Width;
}
if (textwidth > this.Width - 35 - 22) {
paddingright = 18;
} else {
paddingright = 35;
}
}
protected override void WndProc(ref Message m) {
if (m.Msg == WM_MOUSEDOWN) {
DWORD dw = new DWORD(m.LParam);
int x = dw.HI;
int y = dw.LO;
if (x > this.Width - paddingright) {
OnButtonClick();
return;
}
}
base.WndProc(ref m);
}
[EditorBrowsable( EditorBrowsableState.Never ), Browsable(false)]
public new bool ShowUpDown {
get;
set;
}
private void OnButtonClick() {
//-----------------------------------
//#### Show your MonthCalendar ####
//-----------------------------------
}
[StructLayout(LayoutKind.Explicit)]
struct DWORD {
[FieldOffset(0)]
public int Word;
[FieldOffset(0)]
public short HI;
[FieldOffset(2)]
public short LO;
public DWORD(IntPtr word) {
this.HI = 0;
this.LO = 0;
this.Word = (int)word;
}
public static DWORD Empty {
get {
return new DWORD() {
Word = 0
};
}
}
}
}