欢迎来到得力文库 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
得力文库 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    从零开始学VC系列教程完整版.doc

    • 资源ID:36164066       资源大小:5.33MB        全文页数:90页
    • 资源格式: DOC        下载积分:25金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要25金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    从零开始学VC系列教程完整版.doc

    从零开始学VC系列教程 一.信息显示实验题外话:第一次写教程,不知道该怎么开始.以前见过的教程可能都会介绍比较多的理论然后才开始讲实际操作,我想对于VC,理论讲得太多大家可能更糊涂,所以选择了这个方案,我们先一步步照着做,每一次只介绍一两个知识点,并且把理论放在后面说明,希望大家能喜欢这种方式,并对这种方式提出意见和建议,以便以后章节更适合大家的学习.或许我写的还不能称之为教程,只是一些操作步骤与说明,通过这些练习,希望能使大家对VC有一个新的认识.VC的功能是十分强大的,但我们一般并不会用到所有的功能,就像大家熟悉的KeilC一样,其实Keil功能也是很多的,平时也没见谁把Keil的功能都用到了.基于此,我写的这个教程可能在VC专业人士看来比较简单.不是要班门弄斧,而是希望推行上位机技术,形成一个氛围让大家来学习交流,PC机与下位机结合毕竟也是发展的一个方向.望高手谅解小辈的不自量力.同时,我们结合单片机编程,让大家明白上位机控制方法与原理,当然这是今后章节的内容了.本节内容:学会在文本框中显示文本,学会弹出式对话框使用.学习目的:信息显示是人机交互的基础,同时,信息显示也为以后的程序调试打下基础.1. 新建工程.打开VC6.0点击文件->新建,弹出如下对话框.在工程选项中选择MFC AppWizardexe,选择好工程存入的位置,然后在工程名称中填入工程的名称,例如Eg01,填入Eg01后.VC会在我们选择的路径后自动加入一个以工程名命名的文件夹作为工程目录.完成按确定就会进入工程向导,出现以下的提示.在这个我们选择基于对话框就行了.单文档与多文档方式会在以后详细介绍.这里也简要说明一下.单文档.程序一次只能处理一个文档对象(文件).像写字板,记事本等.多文档.程序一次可以处理多个对象(文件),像word之类的,可以同时打开多个文件.基本对话框.程序一般用于处理一些比较小的,工具型的软件.像双龙的ISP下载软件, Easy 51Pro等都是基于对话框.一些不是很复杂的工业软件也通常可以用基于对话框的形式,这种方式的优点是所见即所得,一些控件可以像VB一样拖到工作区就行了.选好以后直接按完成就可以了.至于下一步的向导,这里我们先不管.然后会进入以下的画面.其中红色与绿色是我的标注,看不清图片可以下载图片放大.选中静态文本框TODO:在这里设置对话框控制,单击指标右键,在弹出的快捷菜单中选择属性Properties菜单项,弹出如下对话框修改IDC_STATIC为IDC_FIRSTLABEL,标题可以写为”第一个应用程序”然后关闭这个对话框,就可以看到刚才的静态文本框内容变为”第一个应用程序”了.在刚才的操作中,我们将静态文本框的ID改为了IDC_FIRSTLABEL,在VC中,ID是控件的标志,不能有相同的ID出现,但允许多个名为IDC_STATIC的ID号.所以,一般并不把文件名命为IDC_STATIC,除非以后我们不想在程序中改变这个控件的属性.有一些控制,例如GroupBox一般并不在程序中改变什么,所以不改变其ID号.ID是程序访问控件的标识,所以一个应用程序中不能有重复ID.按下来我们要添加一个按钮.用鼠标将控件条上的按钮拖到对话框上,可以看到对话框上多了一个按钮. 用上叙方法,改变按钮ID为IDC_BTN1,标题改为”显示”,这样就做好一个按钮了.下面我们为按钮添加代码.双击按钮,会出现以下的提示框.按OK为按钮添加响应函数,出面以下画面void CEg01Dlg:OnBtn1() / TODO: Add your control notification handler code here这一段就是刚才按钮的函数了.当然,现在还没有响应.现在我们添加一个事件,让这个按钮按下后上面的静态文本框的内容变为”串口号:COM1 波特率:57600”把上面的代码改为void CEg01Dlg:OnBtn1() / TODO: Add your control notification handler code hereSetDlgItemText(IDC_FIRSTLABEL,” 串口号:COM1 波特率:57600”);添加完成以后,按F7编译.如果编译通过,按F5运行,可以看到程序运行后的对话框按下按钮,可以看到上面的静态文本框的内容改变了.那么恭喜你,完成我们这个例子的第一步操作了.当然,我这里的对话框看起来没那么高,大家可以调一下高度.怎么退回到控件编辑状态呢?首先,我们单击选项卡中的ResorceView,现在大家只能看到Reso看到IDD_EG01_DIALG了吧,这个其实也是一个ID,是我们对话框的ID,如果大家改一下对话框的ID,就可以看到这里的ID也变了.在VC中,所有的控件都认为是窗体,只是形式不同.双击IDD_EG01_DIALG就可以看到我们刚才的控制编辑状态了.双击显示按钮又可以回到代码状态.刚才的例子很简单,却是我们以后会用得最多的.下面我们来分析一下代码void CEg01Dlg:OnBtn1() / TODO: Add your control notification handler code hereSetDlgItemText (IDC_FIRSTLABEL,” 串口号:COM1 波特率:57600”);看看SetDlgItemText这个函数,大家就会明白了, IDC_FIRSTLABEL是我们给静态文本框分配的ID,后面的参数是要显示的内容.上面我们提到过,VC中的控件都认为是窗体,所以,对于所有的文本显示,我们都可以用这个函数来做,大家可以试着加入一个编辑框(Edit),同样可以使用用这个函数,只要ID号对了就可以了.VC对大小写敏感,大家要注意大小写.下面我们用另一个方法来实现.把代码改为void CEg01Dlg:OnBtn1() / TODO: Add your control notification handler code hereCString a;a=” 串口号:COM1 波特率:57600”;SetDlgItemText (IDC_FIRSTLABEL,a);然后按F7编译,无误则按F5运行.可以看到运行结果是一样的.大家可以看到,我们把变量a定义为CString类型,这个类型我们在C中可能没有见过.CString其实是VC中的一个类.这里我们要引入类的概念了.类跟C语言结构体很像,结构体可以有成员变量,但不能有成员函数,类不但可以有成员变量,还可以有成员函数,并且支持多种方法.在VC中,类用class标识.下面是一个类的定义,我们来分析一下.class CEg01Dlg : public CDialogpublic:CString GetPath(void);protected:int GetMax(int a,int b);public:int a;int b;这个类是我改过的,为了大家看得明白一点.首先,我们从这句class CEg01Dlg : public CDialog知道这个类名是CEg01Dlg,那么public后面的CDialog是什么意思呢?CDialog其实也是一个类,是VC中标准对话框类. public CDialog意思是我们定义的这个类CEg01Dlg从CDialog派生,也叫从CDialog继承,从继承这个词语大家就会明白CEg01Dlg不但可以有自身函数,而且还可以用到CDialog里的变量与函数,所以说是继承,就像我们说的继承财产一样,儿子不但可以有自己的钱,还有从老爸那里继承的产财,这些钱都能花.所以,我们也叫CDialog为父类(不是爸类啊),把CEg01Dlg称为子类.当然,这是相对的.如果再定义一个类从CEg01Dlg派生,那么CEg01Dlg也就是父类,派生出来的类就是子类.这段可能有点难明白,大家可以慢慢体会.我们再回到CString上面来,这个类不是派生的,所以也没有父类了.用CString定义一个变量a,我们称为类变量,CString有很强大的功能,我们这里只用到一个功能,就是字符串,a可以是一个不定长度的字符串,所以我们可以给a赋一个任意的字符串而不用关心长度.当然,我们也可以用int StringLen=a.GetLength();来获得这个字符串的长度.从这句可以看到,GetLength()是类CString里的一个函数.大家可能又会关心一个问题,怎么把长度显示出来呢?我们把代码改为void CEg01Dlg:OnBtn1() / TODO: Add your control notification handler code hereCString a;a=" 串口号:COM1 波特率:57600"SetDlgItemText (IDC_FIRSTLABEL,a);a.Format("字符串的长度:%d",a.GetLength();MessageBox(a);运行一下,效果如下这里我们用到了类Cstring的另一个成员函数Format();这个函数用起来跟C语言里的Printf()很像,我就不多说明了.格式化后的字符串还是存放在a中,在这里,我们还用到了一个新的函数MessageBox();我们只是用了这个函数最简单的用法,显示一个字符串.MessageBox用于弹出一个提示对话框.查查MSDN就知道,函数原型是int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );在VC里面,函数可以有默认值,例如LPCTSTR lpszCaption = NULL, UINT nType = MB_OK变量lpszCaption的默认值是NULL, nType的默认值是MB_OK,这些有默认值的变量我们可以不传值,所以这个函数使用时,最简单的用法就是传lpszText就可以了.如果我们要显示一个固定的字串,可以这样调用MessageBox(“大家好”);是不是很简单啊?这一章就写到这里了,一些问题大家可以提.未尽知识点,会在以后再详细介绍.从零开始学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(nPos<100) nPos+=10;else nPos=0;CDialog:OnTimer(nIDEvent);首先定义一个整型的变量nPos用于记录进度条的进度值.默认时,进度条0为空,100为满格.从后的程序大家可以看到,这个变量自加到100就变为0.最难理解的就是(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)->SetPos(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 < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL)CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the application's 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也就是消息,所以,消息可以认为是一个操作记号,记录上一步所发生的或者说是下一步所要处理的事件.系统为消息安排了一个队列,里面可以存放很多个消息,我们称为消息队列.有键盘操作时,把键盘操作放到消息队列里面,相当于做一个记号,我们动了键盘,有鼠标操作时,把鼠标操作放到消息队列,也便记住我们在键盘后还动了鼠标,系统就把这些东西一个个按时间取出来执行.在Windows里面,鼠标消息可以有几种,例如单击落了左键,系统会产生一个消息为WM_LBUTTONDOWN如果我们移动了鼠标,就像产生一个消息为WM_MOUSEMOVE消息入队后,系统会依次处理.当然,我们这样的解释虽然容易懂,但不是非常专业,并且Windows内部处理消息也比这复杂多了,但基本原理就是这样的了,并且,我们在进行操作时,并不用关心Windows的底层是怎么处理这些事件的,除非我们的操作真的让Windows生气了,就必须去查查出什么问题了.说了这么多,消息可能还是一个十分飘渺的概念,倒底要怎么用呢?我们来举个例子说明一下.给系统发消息一般会用到两个函数,一个是SendMessage,另一个是PostMessage,这两个是有点区别的,具体区别作为这次的作品,大家去网上查查.例如我们要退出当前的应用程序,最简单的方法当然是按一下关闭的那个红X,如果我们要自己让程序退出,可以给系统发一个消息,其实那个关闭程序的红X也是这么干的.为了演示,首先在上次的对话框中加一个按钮,修改标题也就是Caption为”关闭程序”,ID号改为IDC_QUIT_ME双击为按钮添加以下代码.PostMessage(WM_CLOSE);编译运行试试,如果没有写错代码就可以用那个按钮退出程序了.这一节也就写到这里了,可以大家还是有点糊涂,慢慢体会一下就好了.还是不明白可以来这里提问.从零开始学VC系列教程之三串口通信与自定义消息 课程之前:首先请大家确认一下前面两章都已经熟悉,因为一些前面已经介绍过的基础操作在这里将不再详细说明,如果有什么问题,可以翻看一下前面的两章或者留言提问.本章是基于PC机与单片机的串口通信,用到了一个动态链接库和一个自定义消息. 学习目标:掌握VC下串口编程式的方法,掌握动态库的静态调用与自定义消息. 课程详解: 1.        参照第一章新建一个基于对话框的Vc工程,名称定义为Eg03. 图片01 (原文件名:001.jpg)   2.        工程建立后,在对话框上加入一个组合框(ComboBox),ID号改为IDC_COMPORT 用于选择使用PC机上的哪一个串口. 在组合框后加入一个按钮,标题(Caption)改为”打开”,ID号改为IDC_BTN_PORTOPEN 用于打开串口,开始通信. 下面加入一个编程框(EDIT),ID号改为IDC_EDIT_RECMSG 用于显示接收到的数据. 在编程框下面再添加一个编程框(EDIT),.ID号改为IDC_EDIT_SEDMSG 用于添加要发送的数据. 然后在这个编程框后加入一个按钮.标题(Caption)为”发送”,ID号为IDC_BTN_SEND 最后调整位置与大小如下 图片02 (原文件名:002.jpg)   3.        添加Lib文件.这里介绍的串口通信用的不是VC自带的MSCOMM控件.原因有两个,一是顺便介绍一下动态库和自定义消息的用法.二是MSCOMM控件使用时数据类型转换比较复杂,并且使用也不是很方便.当然,以后也会介绍多线程串口通信给大家,我们会在后面开设一章多线程编程方法,并在那里详细介绍基于多线程的串口通信.这里使用一个动态库,其实也是别人封装好了的多线程通信,名字是Pcomm.在工程下载中,给出了三个文件,分别是Pcomm.h, Pcomm.lib, Pcomm.dll,现在请大家把这三个文件拷到工程目录,也就是Eg03这个文件夹中.至于什么是动态库,这三个文件倒底是什么作用,我们做完这个例程后再解释,现在还是先按步就搬,营造一个感性认识.下面添加Lib文件到工程.首先点击工程(Project),选择下拉式菜单中的设置(ProjectSettings) 图片03 (原文件名:003.jpg)   然后会弹出一个对话框,在标签卡中选择连接 图片04 (原文件名:004.jpg)   然后在对象/模块中添加Pcomm.lib,完成后如上面所示,单击确定退出.这样,我们就为Pcomm.dll这个动态库添加了静态链接,同时,这也就是动态库的静态链接方法,当然,还有一步就是包含Pcomm.h这个头文件.在刚才的步骤中,我们将Pcomm.Lib添加到工程,这个文件主要用于指定Pcomm.dll中各个功能函数的入口与地址,Pcomm.Lib就像一个地图指出目的地的路标,而真正的函数是在Pcomm.Dll中的.当然,为了方便调用,我们还要得到Pcomm.Dll中的函数声明,这些函数声明就在Pcomm.h这个头文件中,所以,大家打开Pcomm.h这个文件,只有函数与变量定义,并没有函数过程.下面我们来添加这个文件. 4.        打开左边的工作空间(WorkSpace)中选择标签ClassView(这里大家只能看到Class 这一步前两章已经详细介绍过了,大家可以参考.),然后双击OnInitDialog就可以打开代码窗口了,在原有头文件包含后面加入串口头文件引用.输入#include ”Pcomm.h”就可以了,完成后如下图 图片05 (原文件名:005.jpg)   这一步我们加入了动态库的函数声明,后面就可以直接使用Pcomm.Dll中的函数了.下面我们来添加事件响应. 单击工作空间中间的标签ResourceView(大家看到的是Reso),再双击IDD_EG03_DIALOG就可以回到控件编辑状态. 图片06 (原文件名:006.jpg)   首先为打开按钮添加代码.双击打开按钮,然后在按钮事件中添加.完成后如下 void CEg03Dlg:OnBtnPortopen()          / TODO: Add your control notification handler code here         Port=GetDlgItemInt(IDC_COMPORT);         if(SIO_OK!=sio_open(Port)                          MessageBox("串口打开错误");                  else                          sio_ioctl(Port,BaudRate,DataBits | StopBits | Parity);                 sio_cnt_irq(Port,CntIrq,1);                  其中, sio开头的变量与函数都是Pcomm中的,我们来解释一下. sio_open是打开某个串口,传入的参数是串口号,如果我们要打开COM1,可以用sio_open(1),返回的参数在Pcomm里面定义了,如果返回SIO_OK就表示串口打开没有问题,否则,就是打开串口失败. sio_ioctl用于设置通信的相关信息,Port中串口号, BaudRate是波特率, DataBits是数据位数, StopBits是停止位数, Parity是校验. sio_cnt_irq用于设定中断回调函数.中断回调函数其实前面的Timer定时器里也提到过,在这里,我们设定一个中断回调函数,每当串口接收到指定字节数据时,系统就会自动调用这个中断回调函数,就像单片机中的串口中断函数一样.这里的回调函数名是CntIrq,我们将在后面定义.细心的朋友一定会发现, BaudRate,DataBits | StopBits | Parity这些都没定义过啊?所以要定义一下这些变量.参照前面的加入文件的方法,在头文件引用下一行加入以下宏定

    注意事项

    本文(从零开始学VC系列教程完整版.doc)为本站会员(叶***)主动上传,得力文库 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知得力文库 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于得利文库 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

    © 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

    黑龙江省互联网违法和不良信息举报
    举报电话:0468-3380021 邮箱:hgswwxb@163.com  

    收起
    展开