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由于

C# DateTimePicker change MonthCalendar

这是一个小技巧,但应该可以正常工作。

首先我们在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
                };
            }
        }
    }
}