Visual C++中的日历控件使用详解(二)

翻译|其它|编辑:郝浩|2005-03-24 12:26:00.000|阅读 818 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


 三、日历控件属性操作

  在对话框或窗口中创建一个日历控件后,它仅显示当前的月份并仅仅只能显示一个月份,这是因为,按照默认的设计,控件的长、宽、高只能容纳一个月的日期,如果要显示两个月,就要增加控件的宽度(同样的道理,也可以通过增加高度来显示两个月份)。

  作为一个可视化对象,日历控件可以用不同的颜色来表现背景、星期日、标题条文本、标题条背景等。作为开发人员理所当然地可以通过程序来更换这些颜色,当然是要在不影响控件亲合力的情况下。改变日历控件的颜色,需要调用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是可供选择的最大日期。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP