65.9K
CodeProject 正在变化。 阅读更多。
Home

CoolCalendar 一个永久日历控件

2001年2月15日

viewsIcon

135924

downloadIcon

1820

一个属主绘制的永久日历控件

  • 下载 永恒日历项目 44 Kb
  • 背景

    在我的职业生涯中,我设计了许多用户界面和控件。但我还没有见过内置了永恒或滚动功能的日历。我的意思是,通过选择前一个月或下个月的日期来更改月份,而不是从日历界面切换到月份下拉框。希望这个日历能够克服市场上大多数日历控件的一些不足之处。

    特点

    • 微调控件(可选),一次滚动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;
    }

    有关日历的进一步使用,请参阅示例。如果您发现错误,或希望看到更多功能,请与我联系。

    编码愉快... :)

    © . All rights reserved.