在Winform中,是否可以增加日历弹出窗口的大小?

3

我想要增加日历弹出框的大小。只增加字体大小只会增加日历框的高度,而不是弹出框。弹出框中的日期仍然很小。 我能否在不使用任何第三方控件的情况下实现这一点?如果可以,应该如何操作?


你可以使用 WPF。它比 winforms 更好,并且控件非常灵活。 - Mohit S
@MohitShrivastava 我很想这样做。但我需要在现有的应用程序中完成,它是一个Winform应用程序。 - SamuraiJack
@Arbaaz 你需要调整下拉菜单的外部窗口大小。这里有一个示例:在覆盖DateTimePicker时设置日历大小 - Jimi
@Jimi 我已经尝试了那个解决方案,但它只增加了弹出窗口的大小,而不是数字(日期)的大小。它只在四周添加了额外的填充。 - SamuraiJack
@Jimi 太好了!它起作用了!虽然这意味着我必须通过代码来控制,对吧?我不能简单地将现有的日期选择器更改为此自定义日期选择器。 - SamuraiJack
显示剩余4条评论
1个回答

3

有一个CalendarFont属性,负责获取/设置下拉日历的字体。但是仅当禁用视觉样式时才会应用该值。

您可以处理DateTimePickerDropDown事件,并查找下拉菜单的MonthCalendar。然后仅针对该控件禁用视觉样式。接着重新计算控件所需的尺寸,并基于日历的最小所需尺寸设置下拉菜单的尺寸。

然后该控件将使用您在CalendarFont属性中指定的字体显示下拉菜单:

enter image description here

代码

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class MyDateTimePicker : DateTimePicker
{
    private const int SWP_NOMOVE = 0x0002;
    private const int DTM_First = 0x1000;
    private const int DTM_GETMONTHCAL = DTM_First + 8;
    private const int MCM_GETMINREQRECT = DTM_First + 9;

    [DllImport("uxtheme.dll")]
    private static extern int SetWindowTheme(IntPtr hWnd, string appName, string idList);
    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
    [DllImport("user32.dll")]
    static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, ref RECT lParam);
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
    int X, int Y, int cx, int cy, int uFlags);
    [DllImport("User32.dll")]
    private static extern IntPtr GetParent(IntPtr hWnd);
    [StructLayout(LayoutKind.Sequential)]
    private struct RECT { public int L, T, R, B; }
    protected override void OnDropDown(EventArgs eventargs)
    {
        var hwndCalendar = SendMessage(this.Handle, DTM_GETMONTHCAL, 0, 0);
        SetWindowTheme(hwndCalendar, string.Empty, string.Empty);
        var r = new RECT();
        SendMessage(hwndCalendar, MCM_GETMINREQRECT, 0, ref r);
        var hwndDropDown = GetParent(hwndCalendar);
        SetWindowPos(hwndDropDown, IntPtr.Zero, 0, 0,
            r.R - r.L + 6, r.B - r.T + 6, SWP_NOMOVE);
        base.OnDropDown(eventargs);
    }
}

这个并不太好用,我把6改成了400,整个东西就变得非常大,有很多空白的地方,而且点击的按钮也没有变大。 - Jay Croghan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接