.NET 中的 MonthCalendar - 扩展一个月
Posted
技术标签:
【中文标题】.NET 中的 MonthCalendar - 扩展一个月【英文标题】:MonthCalendar in .NET - expanding a month 【发布时间】:2013-06-16 19:51:49 【问题描述】:我有一个带有MonthCalendar
控件的 WinForm 应用程序。 MaxSelectionCount
属性设置为 1
天。
我想改变某种行为。如果视图显示控件显示 12 个月并且用户单击一个月,它将展开该月并且所选日期成为该月的最后天。我想将其更改为该月的第一天。我该怎么做?
另外,当我以这种方式扩展一个月时,会引发什么事件?它有特定的事件吗?
谢谢。
【问题讨论】:
【参考方案1】:这在技术上是可行的,因为 Vista 的本机控件会在视图更改时发送通知 (MCM_VIEWCHANGE)。您可以捕获此通知并将其转换为事件。向您的项目添加一个新类并粘贴如下所示的代码。我预先准备了选择第一天的代码。编译。将新控件从工具箱顶部拖放到表单上。在 Windows 8 上测试,您需要检查它在 Vista 和 Win7 上是否正常工作。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class MonthCalendarEx : MonthCalendar
public enum View Month, Year, Decade, Century ;
public class ViewEventArgs : EventArgs
public ViewEventArgs(View newv, View oldv) NewView = newv; OldView = oldv;
public View NewView get; private set;
public View OldView get; private set;
public event EventHandler<ViewEventArgs> ViewChange;
protected virtual void OnViewChange(ViewEventArgs e)
if (ViewChange == null) return;
// NOTE: I saw painting problems if this is done when MCM_VIEWCHANGE fires, delay it
this.BeginInvoke(new Action(() =>
// Select first day when switching to Month view:
if (e.NewView == View.Month)
this.SetDate(this.GetDisplayRange(true).Start);
ViewChange(this, e);
));
protected override void WndProc(ref Message m)
if (m.Msg == 0x204e) // Trap WMREFLECT + WM_NOTIFY
var hdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
if (hdr.code == -750) // Trap MCM_VIEWCHANGE
var vc = (NMVIEWCHANGE)Marshal.PtrToStructure(m.LParam, typeof(NMVIEWCHANGE));
OnViewChange(new ViewEventArgs(vc.dwNewView, vc.dwOldView));
base.WndProc(ref m);
private struct NMHDR
public IntPtr hwndFrom;
public IntPtr idFrom;
public int code;
private struct NMVIEWCHANGE
public NMHDR hdr;
public View dwOldView;
public View dwNewView;
【讨论】:
在 Win7 中运行良好。谢谢。以上是关于.NET 中的 MonthCalendar - 扩展一个月的主要内容,如果未能解决你的问题,请参考以下文章
vb.net monthcalendar 判断是不是选中某个日期