当前位置:首页 >> 建筑/土木 >>

VC 日历控件使用


VC++编程技术连载---VC++日历控件使用 2007-06-22 08:12:41 VC++编程技术连载---VC++日历控件使用 一、有关日历控件的介绍 Win32 API 提供了一个显示日期得当彩色日历控件,日期的显示模式是基于控制面板中 的区域性设置或者说是依赖于用户的操作系统。具体的日历控件如下图一所示:

图一、日历控件显示效果 这个常用的日历控

件的标题条包含两个按钮和两个标签,左边的按钮准许用户单击选择 前一个月份,左边的标签显示当前选择的月份,右边的标签显示当前日期中的年份。右边的 按钮是让用户选择下一个月份。日历控件可以配置成显示多个月份,下图是一具体的实例:

图二、显示多个月份的日历控件 如果要让日历控件显示多个月份,按钮的个数将通过前月或后月列表来增加或减少。例 如,如果控件正在显示 4 月或 5 月,这时用户点击了左边的按钮,控件将显示 3 月或 4 月; 如果用户点击了右边的按钮,控件将显示 5 月和 6 月。此外,选择当前年份中的任意一个月 份,用户可以点击标题框中的月份名,这时候将显示一个月份列表供用户来选择。具体如图 所示:

图三、显示月份列表 如果要更改年份,用户可以点击年份标签,这时候将显示旋转按钮,用户可以通过点击 旋转按钮的上下键来更改年份,也可以使用键盘上的上下箭头来更改年份。

图四、更改日历控件的年份 在标题条的下面,根据控制面板的格式显示着星期的简写,在英语地区,每个星期的第 一天通常是星期天。开发人员可以改变控件中的第一天设置。 控件上,当前选择的日期有一圆圈。用户可以点击欲选择的日期来在控件上选择一个日 期。在大部分地区,日期以数字的形式显现在一个白色背景上(这个背景颜色乃至控件上的 任何颜色可以通过程序来改变) 。默认的情况下,控件显示一个椭圆围绕的当前日期。使用标 题条按钮、月份和年份标签,用户可以更改日期。如果控件显示的不是当前日期,用户可以 通过点击控件底部显示今天日期的标签来使控件显示今天的日期。 (如果你是一个程序员, 可 以隐藏控件底部这个显示今日日期的标签) 。

二、创建日历控件 我们可以在窗口、对话框架、工具条及其他任何容器窗口中创建日历控件。日历控件对 应着 CmonthCalCtrl 类,所以要动态创建一个日历控件,需要声明一个 CmonthCalCtrl 变量 或指向 CmonthCalCtrl 的指针,代码如下: // Exercise1Dlg.h : header file class CExercise1Dlg : public CDialog { // Construction public: CExercise1Dlg(CWnd* pParent = NULL); // standard constructor private: CMonthCalCtrl *ctlCalendar; };

CmonthCalCtrl 类象 MFC 中其他控件对应的类一样,提供了一个 Create()方法用来在容 器窗口中动态创建日历控件,代码如下: CExercise1Dlg::CExercise1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CExercise1Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CExercise1Dlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); ctlCalendar = new CMonthCalCtrl; } ///////////////////////////////////////////////////////////////////////////// // CExercise1Dlg message handlers BOOL CExercise1Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The Framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here ctlCalendar->Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER,CPoint(20, 20), this, 0x224); return TRUE; // return TRUE unless you set the focus to a control }

三、日历控件属性操作 在对话框或窗口中创建一个日历控件后, 它仅显示当前的月份并仅仅只能显示一个月份, 这是因为,按照默认的设计,控件的长、宽、高只能容纳一个月的日期,如果要显示两个月, 就要增加控件的宽度(同样的道理,也可以通过增加高度来显示两个月份) 。 作为一个可视化对象,日历控件可以用不同的颜色来表现背景、星期日、标题条文本、 标题条背景等。作为开发人员理所当然地可以通过程序来更换这些颜色,当然是要在不影响 控件亲合力的情况下。改变日历控件的颜色,需要调用 CMonthCalCtrl::SetColor() 方法, 该方法的语法是: COLORREF SetColor(int nRegion, COLORREF ref); 默认情况下,控件的标题条显示蓝色背景,如果要改变它,需要向 nRegion 参数传递 MCSC_TITLEBK 值,向 ref 参数传递你所要显示的颜色。如果更改标题条上文本的颜色,需要 向 nRegion 参数传递 MCSC_TITLETEXT 值。

图五、更改控件的标题条颜色 上文说过,在标题条的下方显示着星期日,在英语国家,一个星期的第一天是星期天, 如果你想更改一个星期的第一天,可以调用函数 SetFirstDayOfWeek(),它的语法是: BOOL SetFirstDayOfWeek(int iDay, int* lpnOld = NULL); 第一个参数必须是对应的下列整数值: Value Weekday 0 Monday 1 Tuesday 2 Wednesday 3 Thursday 4 Friday 5 Saturday 6 Sunday 如果想要获知日历控件的星期天中具体哪一天设置为第一天,可以调用函数: GetFirstDayOfWeek(),它的语法是: int GetFirstDayOfWeek(BOOL* PBLocal = NULL) const; 该函数返回一个整数值,它对应的含义与上个表格一致。

星期日的名字使用的颜色与使用 SetColor()函数传递 MCSC_TITLETEXT 时使用的颜色一 致,在星期日的下面是一个水平分割线,默认情况下它该是黑色的,但这里它却与选择的日 期一个颜色。在分割线下是日期列表,默认情况下背景是 Windows 默认的白色,如果要改变 它,需要向 nRegion 参数传递 MCSC_MONTHBK 值,向 ref 参数传递你所要显示的颜色。 表示日期的数字显示有两种颜色,当前选择的月份中的日期以黑色表示,如果要改变这 种颜色,可以向需要向 nRegion 参数传递 MCSC_TRAILINGTEXT 值,向 ref 参数传递你所要显 示的颜色。

图六、更改日历控件的日期显示颜色 分割线下的日期列表以两种颜色显示,为了规定当前月份中日期的颜色,可以向需要向 nRegion 参数传递 MCSC_TEXT 值,向 ref 参数传递你所要显示的颜色。 日历控件习惯于用两种形式来让用户了解当前的日期,一是在列表中以椭圆将当前日期 圈起来,另一种方式是在底部以句子的形式显示。在创建控件时,将"today"属性设置为"NO" 将不显示今天的日期。

图七、不显示"今日"标签的日历控件 如上所述,默认情况下控件显示今天日期,可以通过编程使用 MCS_NOTODAY 来隐藏这个 标签,代码如下: BOOL CExercise1Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The Framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here ctlCalendar->Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | MCS_NOTODAY, CPoint(20, 20), this, 0x224); return TRUE; // return TRUE unless you set the focus to a control } 我们注意到, 当前日期还被一个椭圆圈了起来,如果要将它隐藏起来,应该使用

MCS_NOTODAYCIRCLE 类型,代码如下: BOOL CExercise1Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here ctlCalendar->Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | MCS_NOTODAYCIRCLE, CPoint(20, 20), this, 0x224); return TRUE; // return TRUE unless you set the focus to a control } 为了获取当前日历控件中选择的日期,可以使用方法:CMonthCalCtrl::GetCurSel(), 该方法重载有 3 个版本,它们是: BOOL GetCurSel(COleDateTime& refDateTime) const; BOOL GetCurSel(CTime& refDateTime) const; BOOL GetCurSel(LPSYSTEMTIME pDateTime) const; 这里有一个例子: void CExercise1Dlg::OnRetrieveBtn() { // TODO: Add your control notification handler code here UpdateData(); CTime tme = this->m_dtpCurrent.GetCurrentTime(); this->m_Result.Format("%s", tme.Format("%A, %B %d, %Y")); UpdateData(FALSE); } 为了控制用户是否可以选择两个以上的日期,在创建控件时可以相应地设置多项选择属 性。例如,如果你想让用户在控件中选择一定范围的日期,可以将多项选择属性设置为真。 为了动态设置多日期选择,应用 MCS_MULTISELECT 属性,代码如下: BOOL CExercise1Dlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here ctlCalendar->Create(WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_BORDER | MCS_NOTODAYCIRCLE | MCS_MULTISELECT, CPoint(20, 20), this, 0x224); return TRUE; // return TRUE unless you set the focus to a control }

图八、显示多选择日期的日历控件 通过属性设置,用户可以在日历控件中选择多个日期,当然,也可以通过动态编程来选 择多个日期,这时,可以调用 CMonthCalCtrl::SetSelRange()方法,它有三个不同的版本, 语法是: BOOL SetSelRange(const COleDateTime& pMinRange, const COleDateTime& pMaxRange); BOOL SetSelRange(const CTime& pMinRange, const CTime& pMaxRange); BOOL SetSelRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange); 如果想获取一个日历控件的可选择范围,可以调用 CMonthCalCtrl::GetSelRange() 方 法。 为了控制用户可选择的日期范围,可以调用 CMonthCalCtrl::SetRange()方法,它也有 三中不同的形式,分别是: BOOL SetRange(const COleDateTime* pMinRange, const COleDateTime* pMaxRange); BOOL SetRange(const CTime* pMinRange, const CTime* pMaxRange); BOOL SetRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange); 第一个参数 nMinRange 是选择范围的开始日期, 参数 nMaxRange 是可供选择的最大日期。


相关文章:
VC++ 时间日期控件控件程序编程步骤(P110)
VC++ 时间日期控件控件程序编程步骤(P110)_工学_高等教育_教育专区。【Ex_Ctrl...[例 Ex_Ctrl6SDI] 创建并使用学生基本信息对话框 学生基本信息对话框操作步骤:...
VC++ 列表控件的使用方法
VC++ 列表控件使用方法_计算机软件及应用_IT/计算机_专业资料。列表控件可以看作是功能增强的 ListBox,它提供了四种风格,而且可以同时显 示一列的多中属性值。...
VC++6.0常用控件使用方法简单介绍
VC++6.0常用控件使用方法简单介绍_IT/计算机_专业资料。VC++6.0常用控件使用方法...(只适用与 report 风格 } 8、Date Time Picker---日期时间控件--类 CDateTime...
vc控件使用方法
vc控件使用方法_IT/计算机_专业资料。vc控件使用方法 除非特别说明,本文中所用...(nIndex) ; } 8、Date Time Picker---日期时间控件--类 CDateTimeCtrl (1)...
MFC编程总结各种控件使用说明
VC++6.0 控件工具箱: 2 图形控件(picture):常用于显示位图(Bitmap)和图标(Icon...22 日历控件(Month Calender):MFC 提供了 CMonthCalCtrl 类进行支持。 23 日期/...
VC++6.0MFC常用控件
介绍了一些VC++6.0的MFC中常用的的控件的大致使用方法,对初学者有一定的帮助...日期(2009-03-12)/长日期(2009 年 3 月 12 日)/时间(20:08:06), 日期...
VC中图像控件的用法与总结
VC中图像控件的用法与总结_IT/计算机_专业资料。vc图像控件用法介绍以及相关经验总结。使用picture 控件动态显示图片方法一 控件适应于图片尺寸添加一个 picture 控件,...
vc复选框及相关控件使用
vc复选框及相关控件使用_IT/计算机_专业资料。vc控件的使用,单选框,复选框,...11. 11.处理日期时间和日历的控件 标准控件中有专门处理日期和时间的控件──...
日历设计
掌握 VB 的日历控件使用方法,以及如何灵活利用 Timmer 完成提醒功能。 二、题目分析日历备忘录系统是在 VB 标准 EXE 工程的构架下,结合对软 件功能的实际需要,...
用C++设计一个显示年日历的程序
(VC)2008 年课程设计报告 一, 题目:设计一个显示年日历的程序二,设计思路 1...三,程序清单如果是使用一个文件完成的程序,只需列出程序代码. 如果是使用多文件...
更多相关标签:
vc 日历控件 | excel日历控件使用 | mvc中日历控件的使用 | 如何使用日历控件 | vc radio控件的使用 | vc6.0控件使用手册 | vc控件使用大全 | vc 画日历 |