已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从零开始学VC系列教程 二. 对话框及常用控件实验恭喜你,进入VC学习的第二节了.这一节是人机交互的基础.所谓人机交互,说通俗点就是与机器对话.然而我们现在的技术还不能像科幻片里一样与机器人直接说话就行了.所以,我们的操作意图还得通过文本输入,命令按钮等等来实现.本节内容:学会对话框调用及一些常用控件的使用方法.学习目的:学习人机交互,为软件开发提供界面基础.1. 新建工程.参考第一节的方法新建一个工程,名字为Eg02完成后如下图细心的朋友一定会发现.新建的工程里还有一个对话框,ID名是IDD_ABOUTBOX这个是做什么用的呢?我们用到的软件都会有一个版权声明.通过第一章的学习,大家应该知道怎么观看这个IDD_ABOUTBOX对话框了吧.没错!双击IDD_ABOUTBOX就可以了.我们会看到如下的一个对话框这就是我们这个程序的关于对话框,一般用于版权声明及版本号标识.大家看到的这个对话框里有两个静态文本框和一个图像框(Picture),静态文本框我们在前一节已经介绍过了.大家可以修改一下版权所有这一行,填什么都可以,签个大名也行.完成以后你一定想看看效果,这个对话框怎么打开呢?其实VC已经为我们做好了.先按F7编译,然后按F5运行.大家可以看到程序运行了.单击应用程序图标,就会出现一个菜单,选最后一个关于Eg02,关于对话框就弹出来了.当然,这是系统为我们做好的.自己怎么在程序中调用这个对话框呢?为了演示,首先参考第一节的内容添加一个按钮,然后把按钮的ID改为IDC_BTN_ABOUTME,把标题,也就是Caption改为关于.最终效果如下下面我们为按钮添加代码.相信大家一定还记得怎么进入代码吧.对了,双击关于按钮,在弹出的对话框中点确定就可以了.为了让大家更好的理解下面的操作,我们先要解释一下关于对话框的类.VC向导会为关于对话框建立一个类,大家看看下面的图单击标签ClassView(这里显示的是Class)就可以看到Eg02这个应用程序的类.第一个CAboutDlg就是关于对话框的类.CEg02Dlg对应IDD_EG02_DIALOG.中间的Ceg02App是应用程序的基础类.所以,如果要对关于对话框进行操作,就要用到类CAboutDlg,因为与此有关的函数及变量都封装在CAboutDlg中.看到这里大家可能又糊涂了,没关系,在以后的教程中,通过一些练习大家就会慢慢领会到的.这里还是先为关于按钮添加代码.void CEg02Dlg:OnBtnAboutme() / TODO: Add your control notification handler code here上面是VC为关于按钮添加的响应函数.我们添加代码成以下所示void CEg02Dlg:OnBtnAboutme() / TODO: Add your control notification handler code hereCAboutDlg ADlg;ADlg.DoModal();一共有两句,第一句是CAboutDlg ADlg;作用是定义一个变量Adlg.第二句是ADlg.DoModal();功能是调用类CAboutDlg里的一个函数DoModal();这个函数在MSDN里的解释是Call this member function to invoke the modal dialog box and return the dialog-box result when done. This member function handles all interaction with the user while the dialog box is active. This is what makes the dialog box modal; that is, the user cannot interact with other windows until the dialog box is closed.一般我们用于显示一个对话框.其实大家看看CAboutDlg这个类下面,只有两个函数DoModal()这个函数并不在这个里面.第一章我们提到过类的派生和继承.其实CAboutDlg这个类是派生于CDialog类,DoModal()这个函数是CDialog的成员函数,由于CAboutDlg是继承父类CDialog的,所以CDialog里的函数在CAboutDlg中也可以使用.下面我们来说说几个常用控件的使用.首先在IDD_EG02_DIALOG对话框中加入一个Edit(编辑框)控件.Edit一般用于输入输出数据文本.相当于VB里的TextBox.加入Edit控件后,编辑其属性为然后,我们再加一个按钮(PushButton),并编辑其属性为接下来,我们先说一下要实现的效果.很简单,在编辑框里输入一个文本,然后按显示,就把文本显示在静态文本框中.所以,这里要把静态文本编辑框的ID改为IDC_DISPLABEL下面我们为显示按钮添加代码void CEg02Dlg:OnBtnShow() / TODO: Add your control notification handler code hereCString a;GetDlgItemText(IDC_EDIT_INPUT,a);SetDlgItemText(IDC_DISPLABEL,a);其实不复杂,也只有三句,第一句定义一个CString类变量a 我们来说说GetDlgItemText这个函数吧.查查MSDN就知道函数原型了.int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString& rString ) const;大家看看就觉得奇怪了,怎么有两个原型啊?并且一个是传两个参数,另一个是传三个参数.在VC里面,同一个类下是可以存在多个同名函数的,具体调用哪个函数要看参数的不同.在这里我们传入了两个参数,所以VC会调用int GetDlgItemText( int nID, CString& rString ) const;这个函数.第一个函数是控件的ID号,第二个是字串.第二个传了地址,所以我们在下一句中用的a已经是获得IDC_EDIT_INPUT的文本了.运行效果如下下面介绍一下进度条的使用以及定时器的使用.我们要实现的效果是进度从0到满格,然后再从0到满格,依次循环.每跳一格间隔500ms,这个时间我们用定时器来实现.首先从控件条里拖出一个进程条到对话框,修改属性如下然后我们要介绍一下VC的定时器.VC里面使用定时器有多种方式,我们先介绍一种作为抛砖引玉首先添加一个Windows消息处理器.消息这个词语可能很陌生,我们会在后面很多次说明.这里先照图做在类管理器里选中Ceg02Dlg这个类,然后点右键,就会弹出一个菜单,选择Add Windows Message Handler,接下来会弹出另一个菜单双击WM_TIMER然后按确定就可以了.大家会看到,CEg02Dlg类中多了一个函数这个就是VC中的定时器响应函数.然后双击这个函数就进入代码了然后我们为Timer事件添加代码.void CEg02Dlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default IDC_PROGRESSstatic int nPos=0;(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)-SetPos(nPos);if(nPosSetPos(nPos);首先, GetDlgItem(IDC_PROGRESS)这个函数用来获取IDC_PROGRESS的句柄,在VC里面引入了句柄这个词语,我们将在下一章中对消息和句柄进行详细的说明, 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。在这里,GetDlgItem获取了窗体句柄,大家应该还记得,在VC里面,控制就看成窗体。(CProgressCtrl*)这个地方是将返回的句柄强制转换为CProgressCtrl类型,与C语言的中的强制转换是一样的.进度条的控制类是CprogressCtrl.而前面返回的是一个窗体类型,所以先要强制转换.在第一章中,我们提到过,VC中的控件都认为是窗体,在这里就体现出来了. SetPos(nPos);这个函数是类CprogressCtrl的成员函数,用来指定当前进度条的进度.最后还有一步,就是激活这个定时器.像我们的C51或AVR一样,要初始化定时器. 而void CEg02Dlg:OnTimer(UINT nIDEvent)这个函数就像我们单片机的定时器中断服务函数一样.时间到了就会自动执行.参考上面的图,双击OnInitDialog(),就可以进入对话框初始化函数,只要添加一句就可以了.完成后如下BOOL CEg02Dlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization hereSetTimer(0,500,NULL); /这里是添加的,别的都是自动生成的return TRUE; / return TRUE unless you set the focus to a control在这里我们只添加SetTimer(0,500,NULL);其中,参数0代表定时器的ID号为0,.第二个参数500是定时器的时间,单位为ms,后面的NULL是指不要回调函数.按F7编译后运行就可以看到运行效果了.或许大家有个问题,为什么开始时是添加了一个WM_TIMER的消息处理器呢?我们使用SetTimer开始定时器后,如果没有回调函数,系统会在每次定时时间到后发送一个WM_TIMER消息到窗体.窗体收到这个信息后,调用OnTimer()函数进行处理.系统定义这个函数为afx_msg void OnTimer(UINT nIDEvent);可以看到是以afx_msg修饰的,这种函数会与其中一个信息关联,或者说是消息影射到这个函数.每当有消息发过来,都会执行这个函数.大家只要好好想想单片机的定时器中断就会明白的,原理一样,只是传输机制不同.如果上面的内容你制作成功了,那么恭喜你,第二节就基本学完了.下面我们也来说说多任务和消息机制吧.Windows是基于消息机制的,它是一个多任务的操作系统,也就是说,同一时间内,系统会挂起多个任务.为了说明多任务,我们先来看一段单片机程序.Void main(void)While(1)TaskA();这个程序很简单,单片机工作后就进入while()循环了,单片机这个时候就干一件事,那就是执行任务TaskA.这样的工作总是在一个主循环内实施,一次只执行一个任务的我们称为单任务系统.单片机程序只要不引入操作系统并且由一个主循环一直执行完毕的基本都是单任务的.有些程序也是这样写的.Void main(void)While(1)TaskA();TaskB();TaskC();这样的程序看起来似乎是有三个任务了.这三个任务是顺序执行的,也就是说,必须让A完成后,才能到B,B完成后才能到C.如果A有一个长时间的延时,系统就会在A中空等,然而B与A本来是无关的,这样空等的时间就算是浪费了.如果我们的windows也是顺序执行的就麻烦了,那时我们不仅仅会说Windows有点慢,而是说Windows像蜗牛一样在爬.如果我们让这些任务更合理的安排一下,在执行A的时候,有空就去执行B,而在B的空闲时间去执行C或者A,那么时间就节省下来了.如果时间切换够快,那么我们可以认为A,B,C三个任务在同时进行.所以,如果我们把单片机的执行时间分成若干等份,每份1ms或者更小,这种时间等份我们称为时间片,每次时间到了就换一个任务.也就是说,第一毫秒执行A,这时我们并不等A全部执行完,并记住这个断点,到了第二毫秒执行B,第三毫秒执行C,第四毫秒又执行A并从原来的断点开始执行,依次直至三个任务都完成.大家可以看到,任务A每三毫秒执行了一次.这就是多任务的模型了.Windows其实就是这么干的.只是每次任务时间不一定是我们上面说的3ms,因为系统同一时间内可能会有很多待执行的任务,这些任务就被系统按优先级排成队,一个个取出来执行.比如我们现在打开VC,系统在加载VC,同时我们还可以移动鼠标,这些好像都是在同时进行,其实它们也是按时间片分时执行的.现在分析一下这个工作过程吧.现在我们要打开VC,系统开始加载VC了,可以看到VC的LOGO界面,但这个时候我们还可以动一下鼠标,硬件首先会响应,并给软件发个通知,而软件这个时候可能还没有轮到鼠标程序的执行,怎么办呢?系统会先把这个鼠标操作保存起来,轮到鼠标时间片时再来处理鼠标操作.大家可能觉得,这样鼠标操作不是滞后了吗?确实是这样的,但这个滞后时间是很短的,我们基本不会察觉出来.我们来看看消息的定义.消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。综合前面的分析,消息就好理解了,鼠标动一下会产生一个事件,这个事件必须要告诉系统啊,怎么告诉系统呢?Windows把这个定义为Message也就是消息,所以,消息可以认为是一个操作记号,记录上一步所发生的或者说是下一步所要处理的事件.系统为消息安排了一个队列,里面可以存放
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年酿造机械设备市场前景分析
- 九年级英语Unit 8 It must belong to Carla (原卷版)
- 设备器件行业深度研究报告
- 智慧纺织工业园项目风险评估报告
- 桥梁结构设计与优化方案
- 风电场土建工程实施方案
- 桥梁加固与维修技术方案
- 水利水电工程体系运行管控措施的探索与分析
- 钢结构质量控制方案
- 兄弟分家协议书模板
- 2024人教版七年级全一册体育与健康全册教案
- 2025年新能源汽车租赁市场创新与商业模式研究报告
- GB/T 25053-2025热连轧低碳钢板及钢带
- 宿舍消防用电安全培训课件
- 《森林报·冬》读书分享
- DB65T 4398-2021 棉花耐盐防病促生菌种衣剂和滴灌肥料施用技术规程
- 污水厂设备培训课件
- 《油气储存企业安全风险评估细则(2025年修订)》解读
- 柴油机使用管理课件
- 2025年思想道德修养与法律基础社会实践报告
- 《长方体和正方体的认识》课件 2025-2026学年小学数学六年级上册 苏教版
评论
0/150
提交评论