我正在尝试增加日历弹出窗口的大小。增加字体只会增加日历框的高度,不会增加弹出框的高度。弹出窗口中的日期仍然很小。 我可以在不使用任何第三方控件等的情况下执行此操作吗?如果是怎么办?
最佳答案
有一个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);
}
}
关于c# - 是否可以增加 winform 中日历弹出窗口的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48020286/