我想要增加日历弹出框的大小。只增加字体大小只会增加日历框的高度,而不是弹出框。弹出框中的日期仍然很小。 我能否在不使用任何第三方控件的情况下实现这一点?如果可以,应该如何操作?
我想要增加日历弹出框的大小。只增加字体大小只会增加日历框的高度,而不是弹出框。弹出框中的日期仍然很小。 我能否在不使用任何第三方控件的情况下实现这一点?如果可以,应该如何操作?
有一个CalendarFont
属性,负责获取/设置下拉日历的字体。但是仅当禁用视觉样式时才会应用该值。
您可以处理DateTimePicker
的DropDown
事件,并查找下拉菜单的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);
}
}