我创建了自己的MonthCalendar (选择多项内容和更多更改),并希望在DateTimePicker中使用它。以DateTimePicker为例,当单击右键时,它会显示我的自定义日历。有容易的方法吗?或者我应该像本教程中那样自己创建它:http://www.techpowerup.com/forums/showthread.php?t=70925,谢谢
发布于 2011-08-17 22:39:33
这是一个小技巧,但它应该可以很好地工作。
首先,我们在OnSizeChanged上检查我们有什么按钮,大的(有图标)还是小的(没有图标)。如果是大按钮,按钮的像素是35像素,小的是18像素。
然后我们收听窗口的消息。如果鼠标按下,我们检查用户点击的位置。因此,我们将lParam转换到X/Y位置。如果X位置在按钮区域,我们转到自定义方法并显示我们的日历。在我们从方法返回的方法之后,或者DateTimePicker也会显示它自己的日历。
另外,我们覆盖ShowUpDown属性并将其设置为可浏览(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
};
}
}
}
}https://stackoverflow.com/questions/7090327
复制相似问题