Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 覆盖DateTimePicker以添加周数时设置日历大小_C#_Winforms_Datetimepicker - Fatal编程技术网

C# 覆盖DateTimePicker以添加周数时设置日历大小

C# 覆盖DateTimePicker以添加周数时设置日历大小,c#,winforms,datetimepicker,C#,Winforms,Datetimepicker,我正在尝试创建一个显示周数的日期时间选择器 它工作得相当好,除了一个小细节;尝试选择日期时弹出的日历大小不正确。如您所见,日历区域有点“拥挤”,尤其是在右侧边缘 我可以在这里单击右下角,并将其向外拖动一点-刚好足以展开它,使其看起来正确: 我似乎找不到任何方法来强制日历从一开始就是正确的/完整的大小,或者调整它的大小。最终找到了一个似乎有效的解决方案-至少现在是这样 似乎在DateTimePicker的日历部分有两个窗口。显然,我的代码会自动找到内部的正确大小(至少多少?),但不会找到外部的

我正在尝试创建一个显示周数的日期时间选择器

它工作得相当好,除了一个小细节;尝试选择日期时弹出的日历大小不正确。如您所见,日历区域有点“拥挤”,尤其是在右侧边缘

我可以在这里单击右下角,并将其向外拖动一点-刚好足以展开它,使其看起来正确:


我似乎找不到任何方法来强制日历从一开始就是正确的/完整的大小,或者调整它的大小。

最终找到了一个似乎有效的解决方案-至少现在是这样

似乎在
DateTimePicker
的日历部分有两个窗口。显然,我的代码会自动找到内部的正确大小(至少多少?),但不会找到外部的

经过一点研究,得出了下面的代码。以下链接提供了一些有用的相关信息:

  • (用于获取有关要编辑的窗口的信息)
  • (正在查找外部窗口,以便我们也可以对其应用设置)
诀窍是在(内部)窗口的高度和宽度上增加一点,然后将相同的高度和宽度应用于外部窗口(我使用
GetParrent()
函数访问)。我通过反复试验找到了“正确”的大小:当大小与日历内容所需的大小相匹配时,就无法再调整大小了

是的,这感觉有点像黑客,不,我还没能验证它在我自己的电脑之外的其他电脑上是否能完美工作。我有点担心必须给出高度和宽度的具体值,但我希望这不会受到屏幕分辨率或其他任何因素的影响

希望处于类似情况的其他人会发现该代码有用。
(以下可直接替换常规的
日期时间选择器
,以在日历中显示周数)


好的,尝试在Program.cs中注释行

Application.EnableVisualStyles();

然后尝试执行。

对于我来说,通过DateTimePicker的
DTM\u SETMCSTYLE
消息设置
MCS\u WeekNumber
会自动生成正确大小的MonthCal控件:

SendMessage(Handle, DTM_FIRST + 11, 0, SendMessage(Handle, DTM_FIRST + 12, 0, 0) | MCS_WEEKNUMBERS);
其中,
DTM_FIRST=0x1000
MCS_WEEKNUMBERS=0x4
,与Kjartan的解决方案相同
DTM_FIRST+11
是微软文档中的
DTM_SETMCSTYLE
DTM_FIRST+12
DTM_GETMCSTYLE


与Kjartan的解决方案不同,此调用必须在第一个下拉列表之前使用,但在某些情况下,表单初始化时对我不起作用,因此我将其延迟到表单已经创建并且在这些情况下可见时。一次调用就足够了,DateTimePicker将保存样式以供将来的下拉列表使用。

尝试修改
DataTimePicker
的字体大小。尝试了,没有帮助。目前正在处理调整父框架/窗口大小的解决方案。显然,日历内有两层(可能更多?)窗口。不知何故,内部的大小是正确的,但外部的大小不是…dll没有添加到表单中创建usercontrol/dll后,当我从工具箱将其添加到表单中时,它没有呈现/添加。请尝试先添加一个常规的
日期时间选择器
。一旦你让它工作起来,替换
DateTimePicker x=newdatetimepicker()带有
DatePickerWithWeekNumbers x=新的DatePickerWithWeekNumbers()。反正我就是这么做的。顺便说一下,您不需要创建单独的DLL,只需将其作为一个类包含在同一个项目中。这解决了我在单击DateTimePicker上的下拉菜单时遇到的一个问题,弹出窗口几乎永远不会出现,当它出现时,它将显示为单个列,或者非常小,以至于您无法使用它。在这里发布此消息,以防其他人遇到此问题。我在我的主窗体上使用了很多嵌套的自定义控件,我想知道这是否与此有关。然而,评论这一行100%修复了我的问题。
SendMessage(Handle, DTM_FIRST + 11, 0, SendMessage(Handle, DTM_FIRST + 12, 0, 0) | MCS_WEEKNUMBERS);