首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# DateTimePicker change MonthCalendar

C# DateTimePicker change MonthCalendar
EN

Stack Overflow用户
提问于 2011-08-17 17:10:20
回答 1查看 2.4K关注 0票数 0

我创建了自己的MonthCalendar (选择多项内容和更多更改),并希望在DateTimePicker中使用它。以DateTimePicker为例,当单击右键时,它会显示我的自定义日历。有容易的方法吗?或者我应该像本教程中那样自己创建它:http://www.techpowerup.com/forums/showthread.php?t=70925,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-17 22:39:33

这是一个小技巧,但它应该可以很好地工作。

首先,我们在OnSizeChanged上检查我们有什么按钮,大的(有图标)还是小的(没有图标)。如果是大按钮,按钮的像素是35像素,小的是18像素。

然后我们收听窗口的消息。如果鼠标按下,我们检查用户点击的位置。因此,我们将lParam转换到X/Y位置。如果X位置在按钮区域,我们转到自定义方法并显示我们的日历。在我们从方法返回的方法之后,或者DateTimePicker也会显示它自己的日历。

另外,我们覆盖ShowUpDown属性并将其设置为可浏览(False)。但我们也可以检查ShowUpDown是否为真,并让DateTimePcker在这种情况下处理点击。

代码如下:

代码语言:javascript
复制
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
                };
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7090327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档