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

标签 c# .net winforms datetimepicker monthcalendar

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

最佳答案

有一个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);
    }
}

关于c# - 是否可以增加 winform 中日历弹出窗口的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020286/

相关文章:

c# - 在 IDisposable.Dispose() 中使用异步调用

c# - 保护 .NET 代码免遭逆向工程?

c# - 获取WebBrowser控件中事件网站的标题

c# - 具有右锚定静态面板的可变高度 FlowLayoutPanel

c# - 将 ListBoxFor (Multiple) 绑定(bind)回模型

c# - c#中的PayPal支付简单示例

c# - .NET 中的表达式树 - 库?

c# - 如何从 savefiledialog 获取完整路径并在 "startInfo.Arguments"中使用?

c# - 私有(private)类中公共(public)属性的可访问性是什么?

c# - 如何根据扩展名获取文件类型信息? (不是 MIME)在 c# 中