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

Posted

技术标签:

【中文标题】是否可以在 winform 中增加日历弹出窗口的大小?【英文标题】:Is it possible to increase size of calendar popup in winform? 【发布时间】:2017-12-29 09:26:25 【问题描述】:

我正在尝试增加日历弹出窗口的大小。增加字体只会增加日历框的高度,而不是弹出框。弹出窗口中的日期仍然很小。 我可以在不使用任何第三方控件等的情况下执行此操作吗?如果是怎么办?

【问题讨论】:

您可以改用 WPF。比winforms好很多,而且控件非常灵活 @MohitShrivastava 我希望我能。但我需要在现有的应用程序中进行,这是一个 winform 应用程序。 @Arbaaz 您需要调整下拉菜单的外部窗口大小。有一个例子:Setting calendar size when overriding DateTimePicker. @Jimi 我已经尝试过该解决方案,但它只会增加弹出窗口的大小,但不会增加数字(日期)的大小。它只是在四个面上添加了额外的填充。 @Arbaaz 还有另一个问题Increase Font Size of DateTimePicker Calender 暗示更改主题(uxtheme.dll -> SetWindowTheme)。我不知道这有多“便携”,但它可能会给你一些提示。 【参考方案1】:

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

您可以处理DateTimePickerDropDown 事件并找到下拉列表的MonthCalendar。然后仅为该控件禁用视觉样式。然后重新计算控件所需的大小,并根据日历所需的最小大小设置下拉菜单的大小。

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

代码

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);
    

【讨论】:

以上是关于是否可以在 winform 中增加日历弹出窗口的大小?的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm中,如何判断窗口已打开

当我在模式弹出窗口中打开日历时,日历会剪切

c# winform的dateTimePicker控件的日历面板的字体怎么调大?

如何在 WinForm 中更改 dateTimePicker 日历大小?

填充 Web 表单的最佳日历弹出窗口是啥?

JavaFX 从 DatePicker 中提取日历弹出窗口/仅显示弹出窗口