当前位置:文档之家› Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

Visual C++基于对话框的MFC应用程序---简单的时钟实例实验一

1.1 创建对话框的应用程序1.使用AppWizard创建应用程序框架首先,创建一个对话框应用程序,其工程文件名为:ch1.dsp。

具体步骤如下:(1)启动Visual C++ 6.0,在File菜单中选择new菜单项;(2)在new对话框的Project页中选择 MFC AppWizard(exe)选项,在Project name框中输入:ch1,并在Location 框中指定希望的目录路径,编译系统生成的各种文件将会存放在该目录下,然后点击[OK]按钮(3)MFC AppWizard-Step1 中选择Dialog based 选项,MFC AppWizard-Step2 到MFC AppWizard-Step4中取默认选项;(4)进入VC对话框设计界面后,选中 [TODO:在这里设置对话控制。

]静态框并按del键删除该框,选中[取消]按钮并按del键删除该按钮; (5)将[确认]按钮拖曳到对话框的下方中间。

生成的对话框设计窗口(如图1-1所示)。

图1-12.向类中添加系统消息响应函数Windows应用程序的采用事件触发、消息驱动机制和大量的消息响应函数构成了应用程序的主体。

本示例需要用到两个消息响应函数OnCtlColor()和OnTimer(),前者响应窗口消息:WM_CTLCOLOR,后者响应窗口消息:WM_TIMER。

关于这两个函数的功能和用法暂且略过,留待后面小节再叙。

这里先介绍响应函数加载的方法。

在CCh1Dlg类中添加OnCtlColor( )函数的操作方法如下:(1)打开类向导(MFC ClassWizard)窗口,选择Message Maps 页;(2)选择工程、类和对象标识。

在Message Maps页的Project、Class name、Object Ids框中分别选择:ch1、CCh1Dlg、CCh1Dlg;(3)添加响应函数。

在Message Maps页的Messages框中选中并双击窗口消息:WM_CTLCOLOR,此时,消息WM_CTLCOLOR 的响应函数OnCtlColor( )被添加到类向导底部Member Functions框中。

注意,添加OnTimer( )函数的过程与上述过程相似,只是第(3)步选择WM_TIMER消息,而不是WM_CTLCOLOR。

添加完毕后,按[OK]按钮退出类向导。

回到项目工作区,在项目工作区窗口展开CCh1Dlg类,可以看到类中添加了OnCtlColor( )和OnTimer( )两个消息响应函数。

1.2 静态框控件1.静态框控件与CStatic类静态框的功能是通过MFC类库中的CStatic类实现的。

静态框可以用来显示文本、位图或图元文件等。

示例ch1中的日历框和时钟框就是通过静态控件实现的,为此,下面将围绕示例介绍静态控件使用方法。

首先在对话框中添加一个显示内容为“当前时间”的静态框,步骤如下:(1)添加静态框。

参考图1-1,用鼠标器单击右边控件工具栏中静态控件(Static Text)按钮,通过鼠标在对话框左边偏上的位置上拖曳出一个静态框,调整静态框到合适的大小;(2)打开静态控件属性对话框。

右击该静态框,从弹出菜单中选择属性(Properties)菜单项,弹出属性(TextProperties)对话框;(3)更改静态框中文本内容。

在属性对话框中选择General 页,将Caption框的内容修改为:当前时间:(4)单击属性对话框右上角的关闭按钮,关闭属性对话框。

接着添加一个显示内容为“00:00:00”的时钟静态框:(1)重复上面(1)、(2)两步操作,在“当前时间:”静态框下方添加一个新的静态框;(2)更改静态控件标识符和文本内容。

在属性对话框中选择General页,将ID框的标识符IDC_STATIC改为:IDC_STATIC1,将Caption框的内容修改为:00:00:00;(3)设置文本对齐方式。

在属性对话框中选择Styles页,从Align text列表框中选择Center选项、在多选框中选中Center Vertically选项;(4)设置边框样式。

在属性对话框中选择Extended Styles 页,选中Static edge项;(5)单击属性对话框右上角的关闭按钮,关闭属性对话框。

最后,按上述方法在对话框的右侧添加一个日历静态框,其属性参数设置如下:(1)在属性对话框中选择General页,将ID 框的标识符IDC_STATIC改为:IDC_STATIC2,将Caption框的内容修改为:\n 2004年03月\n\n 12日\n\n 星期五其中“\n”表示换行,而插入空格是为了调整日期显示的位置;(2)在属性对话框中选择Styles页,从Align text列表框中选择Left选项;(3)在属性对话框中选择Extended Styles页,选中Modal frame 项。

对话框界面设计(如图1-2所示)。

图1-22.更改静态框文本内容程序运行时,用户无法通过键盘输入更改静态框的内容。

如需要动态地变更静态框的内容,可通过编程来实现。

为此需要在CCh3_1Dlg类中添加两个分别与IDC_STATIC1、IDC_STATIC2静态控件相关成员变量,操作如下:(1)在View菜单中选择ClassWizard菜单项,打开类向导(MFC ClassWizard)窗口,并选择Member Variables页;(2)添加成员变量m_Static1。

在Member Variables页的Control Ids 框中选择标识符IDC_STATIC1,并点击[Add Variables…]按钮,弹出添加成员变量(Add Member Variables)对话框,在成员变量名(Member variables name)框内输入:m_Static1,并在种类(Category)、变量类型(Variable type)框内依次输入或选择:Control、CStatic。

按[OK]按钮,退出添加成员变量对话框;(3)添加成员变量m_Static2。

在Member Variables页的Control Ids 框中选择标识符IDC_STATIC2,并点击[Add Variables…]按钮,弹出添加成员变量(Add Member Variables)对话框,在成员变量名(Member variables name)框内输入:m_Static2,并在种类(Category)、变量类型(Variable type)框内依次输入或选择:Control、CStatic。

按[OK]按钮,退出添加成员变量对话框;(4)按[OK]按钮,退出类向导(MFC ClassWizard)窗口。

在项目管理区中双击CCh1Dlg类,这时程序代码窗口CCh1Dlg 类的头文件中,可以看到如下代码:// Dialog Data//{{AFX_DATA(CCh1Dlg)enum { IDD = IDD_CH1_DIALOG };CStatic m_Static2; //由类向导自动插入CStatic m_Static1;//}}AFX_DATA其中插入了CStatic 类型的成员变量m_Static1,该变量为静态控件对象,它通过标识符IDC_STATIC1与图1-2中所示的时钟静态框对应,而m_Static2则通过标识符IDC_STATIC2与日历框对应。

在项目管理区中展开CCh3_1Dlg类,双击OnInitDialog()函数,代码编辑窗口出现该函数的代码,在该函数的结尾部分加上如下代码:BOOL CCh1Dlg::OnInitDialog( ){CDialog::OnInitDialog( )……// TODO: Add extra initialization hereCString str=_T("10:10:10");m_Static1.SetWindowText(str); //更改时钟框的内容return TRUE; // return TRUE unless you set the focus to a control重新编译链接该程序,执行后时钟框显示的内容为:10:10:10。

3.如何获取当前时间为了使该静态框能正确显示当前时间,必须要解决两个问题,首先是如何获取当前系统时间,其次是如何才能不断及时地刷新时钟框的时间。

在MFC应用程序中,不但可以调用Windows API函数,也可以使用C语言运行库函数time_t time(time_t * timer);和struct tm *localtime(const time_t *timer); 要及时地刷新时钟框,需要有相应事件来触发。

为此,可以通过加载系统定时器消息WM_TIMER的响应函数OnTimer( )来实现,用户可以通过SetTimer( )函数设定定时值,这样当定时时间一到,函数OnTimer( )就会自动响应。

我们已经在CCh1Dlg 类中加载了OnTimer( )函数,在项目管理工作区中展开CCh1Dlg类,双击OnTimer( ),将程序代码区的光标移到该函数,加入如下代码:void CCh1Dlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaulttime_t m_time;tm *t;int hour,hour1,min,sec;int year,mon,day,week;CString s;CString s1[7]={"日","一","二","三","四","五","六"};time(&m_time); //获取当前时间值存入m_time t=localtime(&m_time); //转换为tm结构类型hour=t->tm_hour;min=t->tm_min;sec=t->tm_sec;hour1=hour%12; //24小时制转换成12小时制year=t->tm_year+1900;mon=t->tm_mon+1;day=t->tm_mday;week=t->tm_wday;s.Format("%02d:%02d:%02d",hour,min,sec);//将当前时钟送到IDC_STATIC1静态框显示m_Static1.SetWindowText(s);s.Format("\n %4d年%2d月\n\n %2d日\n\n 星期",year,mon,day);s+=s1[week];//将当前日历送到IDC_STATIC2静态框显示m_Static2.SetWindowText(s);SetTimer(0,500,NULL); //重置定时器CDialog::OnTimer(nIDEvent);}为了启动系统定时器,须在CCh1Dlg类的初始化函数OnInitDialog( )中加入SetTimer( )函数,插入的位置如下:// TODO: Add extra initialization hereCString str=_T("10:10:10");m_Static1.SetWindowText(str); //更改时钟框的内容SetTimer(0,500,NULL); //重置定时器return TRUE; // return TRUE unless you set the focus to a control}编译、运行后如下图4.设置静态框字符和背景的颜色静态控件框字符和背景一般使用系统默认的颜色,但也可以改变默认设置,选择用户所需的色彩。

相关主题