首页 理论教育 在VisualC++对话框程序中使用日期控件技巧

在VisualC++对话框程序中使用日期控件技巧

时间:2023-11-16 理论教育 版权反馈
【摘要】:程序提供“设置系统日期”按钮,用户单击按钮后,将MonthView控件中选择的日期设置为系统日期。一般来说,在Visual C++提供的应用程序框架中,基于对话框的程序框架使用AcitveX控件是比较简单的,它的界面设计可以通过简单的鼠标拖放操作完成。图2-3设置系统日期对话框应用程序图2-4生成ActiveX控件容器的选项选中对ActiveX控件的支持后,AppWizard会在应用程序中加入支持ActiveX控件的代码,从而使当前的应用程序成为一个ActiveX控件容器。

在VisualC++对话框程序中使用日期控件技巧

这里将介绍一个基于对话框的应用程序,在对话框中添加Microsoft Monthview Control(Version 6.0)控件,该控件允许用户通过日历风格的界面查看和设置日期信息。程序提供“设置系统日期”按钮,用户单击按钮后,将MonthView控件中选择的日期设置为系统日期。主界面如图2-3所示。

一般来说,在Visual C++提供的应用程序框架中,基于对话框的程序框架使用AcitveX控件是比较简单的,它的界面设计可以通过简单的鼠标拖放操作完成。这个设置系统日期对话框应用程序也是这样设计界面的。读者可以按以下的步骤实现该应用程序。

(1)生成ActiveX控件容器应用程序。

使用AppWizard(应用程序向导)生成项目,项目名字Date,在向导的第一步,选择应用程序类型为基于对话框的类型(Dialog based)。在向导的第二步,确保ActiveX Controls的选项被选中,如图2-4所示。

图2-3 设置系统日期对话框应用程序(使用日期控件)

图2-4 生成ActiveX控件容器的选项

选中对ActiveX控件的支持后,AppWizard会在应用程序中加入支持ActiveX控件的代码,从而使当前的应用程序成为一个ActiveX控件容器。实际上,向导是在应用程序中CDateApp类的InitInstance成员函数的开始加入一行代码:

AfxEnableControlContainer();

同时,在项目的头文件stdafx.h中加入

#include <afxdisp.h>

当然,如果AppWizard向导中没有选中对ActiveX控件的支持,我们也可以用手工的方式添加上述代码到程序中。

(2)添加控件到应用程序项目中。

在创建支持ActiveX控件的容器程序之后,就可以加载所需的ActiveX控件了。本项目所用控件位于Mscomct2.ocx中,它可能已经安装到计算机上并且注册。如果没有,读者要先找到该文件并把它拷贝到计算机上,然后用regsvr32.exe命令进行注册。

接下来选择“Project”菜单的“Add to Project”子菜单下的“Components And Controls”菜单项,会弹出如图2-5所示的对话框。

图2-5 Components and Controls Gallery对话框

在对话框中,Visual C++ Components目录下是Visual C++提供的组件,Registered ActiveX Controls目录下放置的是系统中所有已经注册的AcitveX控件。用鼠标双击Registered ActiveX Controls目录,在列表中选择Microsoft Monthview Control 6.0(SP6),列表中的这个名字可能因机器安装的VC不同而略微有点差别,本例实现的VC因为安装了补丁(Service Pack 6)所以名字后面带个括号,如图2-6所示。

选中MonthView控件后,单击“Insert”按钮,弹出确认对话框,选择确认后会出现如图2-7所示的Confirm Classes对话框。对话框中列出将要加载到项目中和该控件相关的三个类,以及加入项目后每个类的头文件和实现文件的缺省名称。用户可以选择需要插入的类,可以修改每个类的头文件和实现文件的文件名,一般情况下,采用默认的文件名即可。

图2-6 选择需要的ActiveX控件

图2-7 插入控件的相关类

单击“OK”关闭Confirm Classes对话框,然后关闭Components and Controls Gallery对话框。这样项目中就会插入如图2-7中所列出的三个类。

(3)使用ActiveX控件。

进入对话框资源编辑器,打开对话框资源模板IDD_DATE_DIALOG,可以看到,此时在对话框的控件面板中最后位置多了一个新图标(见图2-8),这个图标就代表了MonthView控件,同控件面板中其它的控件一样,可以通过鼠标的拖放操作,将它添加到对话框资源模板中去。依次向对话框模板中添加表2-2所列控件,并将控件布局成如图2-8所示。

表2-2 对话框中各个控件设置

(www.xing528.com)

图2-8 项目各个控件的布局

添加ActvieX控件之后,可以通过属性对话框设置其属性。选中对话框模板中的MonthView控件,然后鼠标右击,在弹出的菜单中选择Properties,将会弹出MonthView控件的属性对话框,具体界面参见图2-9。

图2-9 Microsoft MonthView控件属性设置对话框

与一般的Windows控件(按钮、编辑框、列表框等)相比,AcitieX控件的属性设置对话框有若干特殊的页面,如图2-9所示,MonthView控件比普通Windows控件多的属性页有Control、字体、颜色、图片和All。它们用于设置控件的属性,这种设置发生在应用程序的编辑期间,当应用程序经过编译形成EXE执行时,控件就使用这些值控制外观等一些特征。一个控件在属性对话框中究竟有多少个独特的页面取决于开发者的设计,在本书第九章我们将要介绍ActiveX控件的开发,届时,读者会了解这些页面的由来。

完成控件在对话框模板中的布局之后,使用ClassWizard为编辑框控件和MonthView控件分别关联两个成员变量m_strDate和m_MonthView,如图2-10所示。

图2-10 使用ClassWizard添加控件的成员变量

为控件IDC_MONTHVIEW关联成员变量m_MonthView,主要是为了能在程序中访问该控件的属性和方法。MonthView控件在项目中对应的类CMonthView类提供了许多成员函数,主要是一些GetXXX和SetXXX的函数对,用来获取和设置控件的属性。

(4)ActiveX控件事件映射。

使用ClassWizard映射ActiveX控件的事件与映射Windows控件的消息时一样的,ClassWizard会加入一张事件映射表(event sink map),通过事件映射表把事件同对应的控制函数联系起来,它的工作过程和消息映射表是一样的。事件映射表类似下面的代码:

宏 BEGIN_EVENTSINK_MAP 和 END_EVENTSINK_MAP 标志事件映射的开始和结束,注释对 //{{AFX_EVENTSINK_MAP(CDateDlg) 和 //}}AFX_EVENTSINK_MAP 之间列出的是事件映射的条目。

本项目中,只需对IDC_MONTHVIEW的SelChange事件进行映射,此事件在用户更改控件的日期值后激发,在此事件映射到的控制函数中改变编辑框IDC_EDIT_DATE的显示内容。启动ClassWizard对话框,在Class Name栏中选择CDateDlg类,在Object IDs栏中选择IDC_MONTHVIEW,在Messages栏中选择SelChange事件并双击,在弹出的对话框中,取默认的事件映射的控制函数名,如图2-11所示。

图2-11 ActiveX控件事件映射

单击“OK”确认函数名称后,单击ClassWizard中“Edit Code”,为IDC_MONTHVIEW控件的SelChange事件控制函数OnSelChangeMonthview添加的代码如程序清单2-1所示。

程序清单2-1 CDateDlg::OnSelChangeMonthview函数

(5)使用控件的方法,获取和设置控件的属性。

利用控件提供的一系列Get×××和Set×××方法,能够获取和设置控件的属性,从而可以完成应用程序中的一些其它功能。本项目中,还要处理IDC_BTN_SETSYSDATE按钮控件,实现系统日期的设置,但首先要完成程序的初始化,添加代码到对话框类的OnInitDialog函数中(如程序清单2-2所示)。

程序清单2-2 CDateDlg::OnInitDialog函数

程序清单2-3是对话框模板中两个按钮的消息处理代码。

程序清单2-3 对话框的两个消息处理函数

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈