CoolCalendar 一个永久日历控件






2.80/5 (6投票s)
2001年2月15日

135924

1820
一个属主绘制的永久日历控件
背景
在我的职业生涯中,我设计了许多用户界面和控件。但我还没有见过内置了永恒或滚动功能的日历。我的意思是,通过选择前一个月或下个月的日期来更改月份,而不是从日历界面切换到月份下拉框。希望这个日历能够克服市场上大多数日历控件的一些不足之处。
特点
- 微调控件(可选),一次滚动7天。
- 永恒或滚动功能允许用户点击前一个月和下个月。
- 以编程方式将备注附加到日期
- 符合UI指南
- 日期选择通知
接口
COleDateTime GetDate() | 获取当前选定的日期 |
void ShowSpinner(BOOL bShow); | 显示或隐藏月份微调控件 |
BOOL SetDate(COleDateTime tm); | 设置当前日期 |
BOOL AddNote(COleDateTime& date, CString strNote, BOOL bReplace); | 将备注附加到日期 |
void DeleteNote(COleDateTime& date); | 从日期删除备注 |
void ClearAllNotes(); | 删除所有备注 |
实现
文件
- CalWnd.h & CalWnd.cpp (主要日历功能)
- CalBtn.h & CalBtn.cpp (日历按钮对象)
- Popup.h & Popup.cpp (弹出上下文菜单)
- NoEdit.h & NoEdit.cpp (禁用的编辑框)
在将要托管控件的窗口头文件中,包含 "calwnd.h"
// Include calendar and dependency files #include "CalWnd.h"
现在将 CCalWnd 对象作为托管窗口类的成员
class CMyWnd { public: ... Some other stuff protected: CCalWnd m_wndCalendar;
现在创建日历窗口,通常在托管窗口创建时完成。
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct) { // Call base class implementation of OnCreate first if (CWnd ::OnCreate(lpCreateStruct) == -1) return -1; // Now create our calendar control // This creates the window at the left, top position. // The calendar automatically sizes... if (m_wndCalendar.Create(NULL,"Calendar", WS_VISIBLE|WS_CHILD, CRect(20,20,0,0),this,0x0101) == -1) return -1; ... Some other code
现在我们需要实现日期更改通知的处理程序。(当用户点击日期时)。这插入到您的托管窗口的 .cpp 文件中。将其放在 AFX_MSG_MAP 注释之外。
BEGIN_MESSAGE_MAP(CChildView,CWnd ) //{{AFX_MSG_MAP(CChildView) ON_WM_PAINT() ON_WM_CREATE() ON_WM_LBUTTONDBLCLK() //}}AFX_MSG_MAP ON_MESSAGE(WM_DATE_NOTIFY,OnDateNotify) // <--- HERE END_MESSAGE_MAP()
这插入到您的托管窗口的 .h 文件中。将其放在 AFX_MSG_MAP 注释之外。
//{{AFX_MSG(CChildView) afx_msg void OnPaint(); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); //}}AFX_MSG afx_msg LRESULT OnDateNotify(WPARAM wParam, LPARAM nId); // <--- HERE DECLARE_MESSAGE_MAP()
最后是处理程序本身。
LRESULT CChildView::OnDateNotify(WPARAM wParam, LPARAM nControlId) { COleDateTime tm = m_wndCalendar.GetDate(); TRACE("Date Selected %s for Control ID %d\n",tm.Format("%c"), nControlId); return 0; }
有关日历的进一步使用,请参阅示例。如果您发现错误,或希望看到更多功能,请与我联系。
编码愉快... :)