是否可以在 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
属性负责获取/设置下拉日历的字体。但是只有在禁用视觉样式时才会应用该值。
您可以处理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);
【讨论】:
以上是关于是否可以在 winform 中增加日历弹出窗口的大小?的主要内容,如果未能解决你的问题,请参考以下文章
c# winform的dateTimePicker控件的日历面板的字体怎么调大?