从零开始学VC系列教程之四并口控制与类的使用

合集下载

c程序的四个基本操作过程 -回复

c程序的四个基本操作过程 -回复

c程序的四个基本操作过程 -回复C程序的四个基本操作过程是指预处理、编译、链接和执行这四个主要步骤。

在本文中,我将详细解释这些过程,并介绍它们在C程序开发中的重要性和功能。

首先谈论的是预处理过程。

预处理是编译前的准备步骤,它主要包括把源代码中的宏定义展开、头文件包含、条件编译等操作。

预处理器负责执行这些任务。

在这个过程中,预处理器将源代码中的宏、条件编译语句等替换为实际的代码。

这有助于提高代码的可读性和维护性。

预处理的输出结果是一个被修改过的源文件,它将用于下一个编译阶段。

第二个基本操作过程是编译。

编译是将预处理过的源代码转换为机器语言的过程。

编译器负责执行此任务。

编译器将源代码翻译成机器语言的目标文件。

这个过程主要包括词法分析、语法分析、语义分析和代码优化等步骤。

编译器会检查源代码中的语法错误,并生成目标文件。

编译的输出结果是目标文件,它包含可执行代码的二进制表示。

接下来是链接过程。

链接是将多个目标文件组合成一个可执行程序的过程。

链接器负责执行此任务。

链接器可以分为静态链接和动态链接两种方式。

静态链接是将目标文件中的函数和库代码合并到最终的可执行文件中。

动态链接是在程序运行时将外部库与可执行文件动态地链接起来。

链接的目的是解决程序中代码和数据的引用关系,确保所有符号都能被正确解析。

链接的输出结果是可执行程序文件,可以直接运行。

最后是执行过程。

执行是将可执行程序加载到内存中并运行的过程。

操作系统负责执行此任务。

当用户运行C程序时,操作系统会使用加载器将可执行文件加载到内存中的进程空间,并按照指令逐条执行。

程序在执行过程中使用C P U进行计算和操作,最终产生所期望的结果。

执行过程结束后,程序可以返回结果、输出信息或者继续执行其他任务。

这四个基本操作过程在C程序开发中起着至关重要的作用。

了解这些过程有助于我们理解代码的执行过程、调试程序和提高代码效率。

在预处理过程中,我们可以使用宏定义和条件编译来提高代码的灵活性和可移植性。

c程序的四个基本操作过程

c程序的四个基本操作过程

c程序的四个基本操作过程
C程序的四个基本操作过程通常指的是预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

这是源代码转化为可执行程序的过程中的四个主要步骤。

1. **预处理**:这一步处理源代码中的预处理指令,比如#include 指令,它会把包含的文件内容插入到程序中。

此外,预处理器还会处理条件编译指令,如#ifdef和#endif,以决定哪些代码段是否应该编译。

2. **编译**:编译器将预处理后的代码转化为汇编语言。

这个阶段会检查语法错误,并生成与源代码对应的汇编代码。

3. **汇编**:汇编器将编译器生成的汇编代码转化为目标文件(通常是.o文件)。

这个阶段会将汇编代码转化为机器语言,但还没有进行链接。

4. **链接**:链接器将所有的目标文件和库文件合并成一个可执行文件。

这个过程包括解决符号引用(例如函数调用),确保所有的依赖关系都得到满足。

以上就是C程序的四个基本操作过程。

在编写和运行C程序时,理解这些步骤是非常重要的,因为它们决定了程序的构建方式和运行效果。

计算机VC++程序入门

计算机VC++程序入门

1.6 变量
在程序的执行过程中,其值可以改变 的量称为变量。 1、变量说明方法 数据类型 变量名1,变量名2,…,变量名n;
如: int a,b; char c1,c2,c3; float x,y,z; double m;
//说明了两个整型变量a,b //说明了三个字符型变量c1,c2,c3 //说明了三个实型变量x,y,z //说明了一个双精度实型变量m
编程实现:
/* 程序名:c1_1.cpp 编制时间:2007年8月1日 主要功能:输出字符串 */ # include <iostream.h> // 程序的第二部 分 void main (void) //主函数 { cout << "北京2008奥林匹克运动会" ; //函数体 } 调试与运行: 北京2008奥林匹克运动会
字符型常量是用单引号引起来的单个字符。 如:’a’、’5’、’+’等。在计算机内部是以ASCII码表示的。
转义序列:用转义符“\”开始,后跟一个字符或一个整 型常量(字符的ASCII编码值)来表示特定的控制字符。 必须注意: 转义字符后边的整型常量应是八进制或十六进制, 且取数范围应在0-255之间, 八进制数可以不以0开头,而十六进制必须以0X或0x开头。 注意:C++中:\表示转义字符,’表示字符常量,”表示字 符串常量。因此,当它们作为字符常量出现时,也要采用 转义序列。
1.2 VC++语言的字符集与标识符
1.VC++语言的字符集
一般而言,计算机键盘上所有非功能键符都 可以作为VC++语言的符号,其中最为重要的部分 是VC++语言的字符集。字符集中的字符可用来定 义标识符,如函数名、变量名、数组名等等。 VC++字符集有下列字符组成: (1)大小写英文字母:a – z和 A – Z; (2)数字:0 – 9; (3)下划线: _; (4)其它符号。

小甲鱼《零基础入门学习Python》课堂笔记

小甲鱼《零基础入门学习Python》课堂笔记

[键入公司名称]人生苦短,我用Python [键入文档副标题]徐辉[选取日期]目录01讲:我和Python的第一次亲密接触 (12)02讲:用Python设计第一个游戏 (15)03讲:小插曲之变量和字符串 (17)04讲:改进我们的小游戏 (19)05讲:闲聊之Python的数据类型 (21)06讲:Pyhon之常用操作符 (22)07讲:了不起的分支和循环1 (23)08讲:了不起的分支和循环2 (25)09讲:了不起的分支和循环3 (27)10讲:列表,一个打了激素的数组1 (29)11讲:列表,一个打了激素的数组2 (31)12讲:列表,一个打了激素的数组3 (33)13讲:元组,戴上了枷锁的列表 (36)14讲:字符串:各种奇葩的内置方法 (38)15讲:字符串的格式语句与操作符 (43)16讲:序列相关内置函数介绍 (46)1-16讲:阶段总结 (51)17讲:函数:Python的乐高积木 (52)18讲:函数:灵活即强大 (53)18讲2:py文件打包成exe文件 (55)19讲:函数:我的地盘我做主 (56)20讲:函数:内嵌函数和闭包 (58)21讲:函数:lambda表达式 (60)22讲:函数:递归是神马 (61)23讲:递归:这帮小兔崽子 (62)24讲:递归:汉诺塔 (63)17-24讲:阶段性总结 (64)25讲:字典:当索引值不好用时 (65)26讲:字典:当索引值不好用时2 (66)27讲:集合:在我的世界里,你就是唯一 (69)28讲:文件:因为懂你,所以永恒 (70)29讲:文件:一个任务 (72)30讲:文件系统:介绍一个高大上的东西 (75)31讲:永久存储:腌制一缸美味的泡菜 (79)31讲:异常处理:你不可能总是对的 (80)33讲:异常处理:你不可能总是对的2 (82)34讲:丰富的else语句和简洁的with (85)35讲:图形界面用户入门:EasyGui (87)36讲:类和对象:给大家介绍对象 (87)37讲:类和对象:面向对象编程 (89)38讲:类和对象:继承 (90)39讲:类和对象:拾遗 (91)40讲:类和对象:一些相关的BIF (94)41讲:类和对象:构造和析构 (96)42讲:类和对象:算术运算符 (98)43讲:类和对象:算术运算符2 (100)44讲:魔法方法:简单定制 (101)45讲:魔法方法:属性访问 (103)46讲:魔法方法:描述符 (105)47讲:魔法方法:定制容器 (108)48讲:魔法方法:迭代器 (109)序----小甲鱼四件在我步入职业软件开发生涯那天起就该知道的事情我的软件开发生涯开始于大约15年以前。

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

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

从零开始学VC系列教程一.信息显示实验题外话:第一次写教程,不知道该怎么开始.以前见过的教程可能都会介绍比较多的理论然后才开始讲实际操作,我想对于VC,理论讲得太多大家可能更糊涂,所以选择了这个方案,我们先一步步照着做,每一次只介绍一两个知识点,并且把理论放在后面说明,希望大家能喜欢这种方式,并对这种方式提出意见和建议,以便以后章节更适合大家的学习.或许我写的还不能称之为教程,只是一些操作步骤及说明,通过这些练习,希望能使大家对VC有一个新的认识.VC的功能是十分强大的,但我们一般并不会用到所有的功能,就像大家熟悉的KeilC一样,其实Keil功能也是很多的,平时也没见谁把Keil的功能都用到了.基于此,我写的这个教程可能在VC专业人士看来比较简单.不是要班门弄斧,而是希望推行上位机技术,形成一个氛围让大家来学习交流,PC机与下位机结合毕竟也是发展的一个方向.望高手谅解小辈的不自量力.同时,我们结合单片机编程,让大家明白上位机控制方法及原理,当然这是今后章节的内容了.本节内容:学会在文本框中显示文本,学会弹出式对话框使用.学习目的:信息显示是人机交互的基础,同时,信息显示也为以后的程序调试打下基础.1.新建工程.打开点击[文件]->[新建],弹出如下对话框.在工程选项中选择MFC AppWizard[exe],选择好工程存入的位置,然后在工程名称中填入工程的名称,例如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(){然,现在还没有响应.现在我们添加一个事件,让这个按钮按下后上面的静态文本框的内容变为”串口号:COM1 波特率:57600”把上面的代码改为void CEg01Dlg::OnBtn1(){57600”果编译通过,按F5运行,可以看到程序运行后的对话框按下按钮,可以看到上面的静态文本框的内容改变了.那么恭喜你,完成我们这个例子的第一步操作了.当然,我这里的对话框看起来没那么高,大家可以调一下高度.怎么退回到控件编辑状态呢首先,我们单击选项卡中的[ResorceView],现在大家只能看到[Reso…]看到IDD_EG01_DIALG了吧,这个其实也是一个ID,是我们对话框的ID,如果大家改一下对话框的ID,就可以看到这里的ID也变了.在VC中,所有的控件都认为是窗体,只是形式不同.双击IDD_EG01_DIALG就可以看到我们刚才的控制编辑状态了.双击[显示]按钮又可以回到代码状态.刚才的例子很简单,却是我们以后会用得最多的.下面我们来分析一下代码void CEg01Dlg::OnBtn1(){57600”面我们提到过,VC中的控件都认为是窗体,所以,对于所有的文本显示,我们都可以用这个函数来做,大家可以试着加入一个编辑框(Edit),同样可以使用用这个函数,只要ID号对了就可以了.VC对大小写敏感,大家要注意大小写.下面我们用另一个方法来实现.把代码改为void CEg01Dlg::OnBtn1(){57600”以看到运行结果是一样的.大家可以看到,我们把变量a定义为CString类型,这个类型我们在C中可能没有见过.CString其实是VC中的一个类.这里我们要引入类的概念了.类跟C语言结构体很像,结构体可以有成员变量,但不能有成员函数,类不但可以有成员变量,还可以有成员函数,并且支持多种方法.在VC中,类用class标识.下面是一个类的定义,我们来分析一下.class CEg01Dlg : public CDialog{public: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=();来获得这个字符串的长度.从这句可以看到,GetLength()是类CString里的一个函数.大家可能又会关心一个问题,怎么把长度显示出来呢我们把代码改为void CEg01Dlg::OnBtn1(){式化后的字符串还是存放在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(){们添加代码成以下所示void CEg02Dlg::OnBtnAboutme(){二句是();功能是调用类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(){查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){认时,进度条0为空,100为满格.从后的程序大家可以看到,这个变量自加到100就变为0.最难理解的就是((CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)))->SetPos(nPos);首先, GetDlgItem(IDC_PROGRESS)这个函数用来获取IDC_PROGRESS的句柄,在VC里面引入了句柄这个词语,我们将在下一章中对消息和句柄进行详细的说明, 句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。

VC上机环境图示培训讲解(doc 10页)

VC上机环境图示培训讲解(doc 10页)

VC上机环境图示培训讲解(doc 10页)(5) 在空白处开始写C代码即可(6)编写完代码后,需要先编译,然后运行如何编译?有两种方式:方式1:使用“Build”菜单,如下所示:方式2:使用快捷工具栏,直接点击即可完成编译:(7)使用任一种方式编译时,vc都会弹出一个对话框:此对话框的意思是问你是否要创建一个默认的工程工作空间?选择“是”,这是因为VC是基于工程的一个工作环境,任何程序都要基于工程去创建和运行。

若编写完程序而没有保存就编译,那么系统会弹出另外一个对话框:选择“是”即可。

(8) 此时,vc开始编译源程序,如果有语法错误,会在最下面的消息窗口进行提示:该消息窗口的右边有个垂直滚动条,可以用鼠标向上拖动,查看错误出处和含义:上图中,框起来的部分表示的错误是:d:\vcstudy\first.cpp(8) : error C2146: syntax error : missing ';' before identifier 'printf'文件位置行号错误语法错误错误含义:在'printf'标识前丢失分号;建议修改一个错误后,再重新编译,因为有时候一个错误有可能导致后面出现多个错误。

虽然“warning”可以不用管,但是最好当做错误对待。

(9) 如果编译没有发现错误,可以通过单击工具栏上的!按钮运行程序:也可以通过菜单运行程序,如右所示:1.利用模拟练习系统或进行正式考试时的VC使用方法(1)以模拟考试系统为例,进入系统后,出现如下画面:(2)此时,系统开始计时:在系统中,上面有一个工具栏,单击“隐藏窗口(或者显示窗口)”可以隐藏或者显示下面的题目窗口。

题目窗口中的有三个按钮,分别单击这些按钮,可以查看相关的题目要求。

(也可单击任务栏中相应选项) 单击题目窗口中的“答题”菜单中的“启动Microsoft Visual C++”菜单,可以直接启动VC,如下图所示:(3)启动后的VC6开发工具如下图:(4)单击“文件”菜单,选择“打开”菜单,如下图:(5)此时会出现一个打开菜单,如下图所示,注意:此时进入的是你自己的考生文件目录,如果没有直接进入该目录,请自己选择文件目录,一定不要做错文件夹!(6)这时会打开考生文件夹(每个考生的考生文件夹均不相同),在这个打开对话框中会出现3个文件,分别是blank1.c(程序填空题)、modi1.c(程序修改题)和prog1.c (程序编写题)。

VC调试入门

VC调试入门

VC调试入门作者:阿荣概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。

不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。

这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。

本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。

设置为了调试一个程序,首先必须使程序中包含调试信息。

一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。

为了增加调试信息,可以按照下述步骤进行:•打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开)•选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括:命令行Project settings说明无None 没有调试信息/Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息/Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等/Zi Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息。

/ZI Program Database forEdit and Continue除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。

这个选项同时使#pragma设置的优化功能无效••选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL•如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。

Visual_C++MFC入门教程

Visual_C++MFC入门教程

Visual C++MFC入门教程目录+-- 第一章 VC入门|------|------|------|------|------+-- 第二章图形输出|------|------|------|------|------|------+-- 第三章文档视结构|------|------|------|------|------|------+-- 第四章窗口控件|------|------|------|------|------|------|------|------|------|------|------|------|------|------+-- 第五章对话框|------|------|------|------|------|------|------|------+-- 第六章网络通信开发|------|------+------《》闻怡洋/文如何学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。

万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一点体会讲一下:1、需要有好的C/C++基础。

正所谓“磨刀不误砍柴工”,最开始接触VC时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。

这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。

更重要的是理解并能运用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C++一定要能熟练运用。

2、理解Windows的消息机制,窗口句柄和其他GUI句柄的含义和用途。

了解和MFC各个类功能相近的API函数。

3、一定要理解MFC中消息映射的作用。

4、训练自己在编写代码时不使用参考书而是使用Help Online。

5、记住一些常用的消息名称和参数的意义。

6、学会看别人的代码。

7、多看书,少买书,买书前一定要慎重。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从零开始学VC系列教程之四.并口控制与类的使用学习目标:掌握VC下并口程序的方法及类的使用.课程详解:参照第一章新建一个基于对话框的Vc工程,名称定义为Eg04.图01 (原文件名:01.JPG)类型选基于对话框.在本例中,我们要用到一些资源,现列出如下WinIo.sysWinIo.dll 这是一个动态库,与WinIo.sys完成同并口的连接.WinIo.lib 这是为静态调用提供的引入库文件.虽然引入库文件和静态库文件都是以Lib为扩展名的,但实际上有本质的区别. WinIo.h 这是IO操作的头文件.ParallelPort.cpp 这是一个并口操作类,用于同WinIo接口,并定义了相关的操作函数.虽然这个类用于同WinIo的操作接口,但这个类并不是从WinIO派生的,只是一个独立的自定义类.至于类的自定义,以前我们也提到过.ParallelPort.h 这是并口类的头文件.这几个文件是可以从网上下载到的,并不是我做的,所以这个动态库大家就不用问我要源码了,因为我也没有.首先,把WinIo.lib WinIo.h ParallelPort.cpp ParallelPort.h拷贝到工程目录中,后面马上就要用到.再把WinIo.Dll WinIo.sys 拷贝到工程目录的Debug目录中,以后工程发布后,这两个文件要跟随工程一起.下面添加引入库到系统中,点击[工程]->[设置]在弹出的对话框中选择[连接]标签,然后在[对象/库模块]中加入WinIo.lib完成后如下图.图02 (原文件名:02.JPG)然后加入并口操作类的头文件.一般来说,网上可以下载到的源码都是以类的形式给出的,VC的好处也在于可以把一个操作封装成类,以便在不同的工程中调用.如图,双击类管理器中的Ceg04Dlg在弹出的文件中加入#include "ParallelPort.h" //添加并口类头文件图03 (原文件名:03.JPG)同时,还要定义一个类变量,用于并口类的操作. 在刚打开的类定义文件中找到CEg04Dlg类,并加入一个类变量m_Port,完成后如下图所示图04 (原文件名:04.JPG)为了操行方便,把并口操作类也加入到工程中,点击[FileView]标签,标签位置在类管理类下面,见上图中的[FileVi…]然后在[Sourc e Files]中加入ParallelPort.cpp在[Header Files]中加入ParallelPort.h这样,就可以在类管理中看到我们所用到的并口操作类了,同时也可以方便的查阅类函及成员变量.下面在界面中加入六个按钮和两个文本编辑框,方法前面已经介绍多次.完成后如下图图05 (原文件名:05.JPG)其中,各控件ID如下上面的编辑框 IDC_EDIT_READ 用于显示收到的数据下面的编辑框 IDC_EDIT_WRITE 用于填写要发送的数据读数据口 IDC_BTN_DREAD 用于读取并口数据总线写数据口 IDC_BTN_DWRITE 用于写并口数据口数据读控制口 IDC_BTN_CREAD 用于读取并口控制总线写控制口 IDC_BTN_CWRITE 用于写并口控制口数据读状态口 IDC_BTN_SREAD 用于读并口状态总线并口流水灯 IDC_BTN_LED 用于在数据线上输出流水灯效果先要介绍一下并口,以便理解接下来的操作是什么意思.以下一些关于并口的介绍,摘自互联网.并口SPP模式寄存器定义数据寄存器(基地址)位引脚:D-sub 信号名信号源是否在连接器处倒相引脚:Centronics0 2 数据位0 PC 否 21 3 数据位1 PC 否 32 4 数据位2 PC 否 43 5 数据位3 PC 否 54 6 数据位4 PC 否 65 7 数据位5 PC 否 76 8 数据位6 PC 否 87 9 数据位7 PC 否 9注:控制寄存器的第5位控制数据位是否能够输出。

状态寄存器(基地址+1)位引脚:D-sub 信号名信号源是否在连接器处倒相引脚:Centronics3 15 nError 外设否 324 13 Select 外设否 135 12 Paper Out 外设否 126 10 nAck 外设否 107 11 Busy 外设是 11注:1,2位未定义。

控制寄存器(基地址+2)位引脚:D-sub 信号名信号源是否在连接器处倒相引脚:Centronics0 1 nStrobe PC 是 11 14 nAutoLF PC 是 142 16 nInit PC 否 313 17 nSelectIn PC 是 36注:连接器中没有提供的附加位:4:4:中断启用,此位为1时,IRQ从nAck送往系统的中断控制器;为0时,IRQ不送往中断控制器。

5:5:双向控制端口的方向控制位,此位为0时,输出启动;为1时,不能输出;控制端口可以读取外部逻辑电平。

6、7:未定义。

学过单片机或相关知识的应该可以看懂表格中的意思了,上面罗列的是除去电源及地线后可用到的IO口,数据口8位,由状态寄存器第五位决定能否输出,状态口共5位,控制口共4位.一般我们只用到数据口来传输数据.一般来说,并口基地址是0x378,也就是数据寄存器的地址,在并口类中默认.明白了这些以后,就可以对并口进行相应的操作了.接下来要在程序初始化时初始化并口,在前面的操作中,定义了一个类变量m_Port,这个类变量在后面我们将多次用到.首先展开类管理器中的CEg04Dlg双击OnInitDialog()在窗口初始化中加入以下代码.//在这里初始化并口if(m_Port.InitPort()==TRUE){SetDlgItemText(IDC_EDIT_READ,"并口初始化成功,并口地址:0x378");}else{SetDlgItemText(IDC_EDIT_READ,"并口初始化失败!");}完成后如下图所示图06 (原文件名:06.JPG)m_Port.InitPort()是并口操作类中的并口初始化函数,传入参数是并口地址,由于类定义时默认了0x378为并口地址,这里可以不用传参数了.如果初始化成功,传回布尔变量TRUE,运行一下,应该可以看到并口初始化成功的信息.接下来为读数据口添加代码.双击[读数据口]按钮,在弹出的代码中加入程序如下void CEg04Dlg::OnBtnDread(){// TODO: Add your control notification handler code hereBYTE nPortData=m_Port.ReadData(); //从并口读到数据CString a,b;GetDlgItemText(IDC_EDIT_READ,b); //获取编辑框中原有的文本a.Format("\r\n读到数据口数据:%2.2X",nPortData);b+=a;SetDlgItemText(IDC_EDIT_READ,b); //写入文本到编辑框//以下用于将滑块自动移到最后一行unsigned char nLine=((CEdit*)GetDlgItem(IDC_EDIT_READ))->GetLineCount();((CEdit*)GetDlgItem(IDC_EDIT_READ))->GetLineCount();((CEdit*)GetDlgItem(IDC_EDIT_READ))->LineScroll(nLine);}完成后如图所示(图8)图08 (原文件名:08.JPG)这样就可以从并口读到数据了.同样的,可以添加控制口,状态口的按钮响应代码,用于读到控制口及状态口,方法相同,这里就不再详叙了.不同的是读控制口时,用到的函数是m_Port.ReadCtrl();读状态口用到的函数是m_Port.ReadState();再有一个问题要说一下,编辑框默认状态下是单行的,也就是说,我们的换行操作是没有用的.可以鼠标右击编辑框,在弹出的菜单中选[属性],并修改其属性如下图所示(图7)图07 (原文件名:07.JPG)下面来添加写数据操作.在写数据操作中,我们要换一种方法来读写文本编辑框了.首先鼠标右击下面的写操作编辑框,在弹出的菜单中选择[建立类向导],英文版的VC请根据翻译.图09 (原文件名:09.JPG)然后会弹出一个类向导对话框, 选择[MemberVariables]标签卡后显示如下.图10 (原文件名:10.JPG),在ID列表中,我们可以看到窗口中为控件添加的ID号,双击[IDC_EDIT_WRITE]会弹出另一个对话框,将各框中的内容修改如下图图11 (原文件名:11.JPG)第一个框中的m_WriteEdit是我们为IDC_EDIT_WRITE这个编辑器定义的一个类变量名,这个类变量会自动与编辑框IDC_EDIT_WRITE 关联,在以后的操作中用到.确定后双击[写数据口]按钮,为写数据口按钮添加代码,完成后如下void CEg04Dlg::OnBtnDwrite(){// TODO: Add your control notification handler code hereCString a;unsigned char b=0;m_WriteEdit.GetWindowText(a); //获取编辑框中文本a.MakeUpper();//全部转换为大写if(a==""){MessageBox("发送内容不能为空!");return;}for(unsigned char i=0;i<a.GetLength();i+=3){if(i+2>a.GetLength()){MessageBox("数据格式填写不正确!");return;}if(a.GetAt(i)>='A' && a.GetAt(i)<='Z') b=(a.GetAt(i)-55)*16; //判断填入的是字母还是数字,并把字符转换成十六进制数else if(a.GetAt(i)>='0' && a.GetAt(i)<='9') b=(a.GetAt(i)-0x30)*16;else{MessageBox("数据格式填写不正确!");return;}if(a.GetAt(i+1)>='A' && a.GetAt(i+1)<='Z') b+=(a.GetAt(i+1)-55);else if(a.GetAt(i+1)>='0' && a.GetAt(i+1)<='9') b+=(a.GetAt(i+1)-0x30);else{MessageBox("数据格式填写不正确!");return;}m_Port.WriteData(b);}}这里可能有点长,其实与第三章的发送是一样的,增加了一点容错处理而已.在这里,我们用m_WriteEdit.GetWindowText(a);来获取编辑框中文本, m_WriteEdit是开始时候在类向导中定义的变量,GetWindowText是一个窗口函数,因为文本编辑框也认为是窗口,所以窗口操作函数是通用的,由于m_WriteEdit与文本框IDC_EDIT_WRITE关联,获取的是文本框中的内容.同样,由于m_WriteEdit是CEdit变量,于是就可以有所有CEdit的所有属性,这与结构变量有点相似,大家可以慢慢体会.其余口的操作类似,不再重复说了.这个并口类还有很多功能函数,这里也清一下.#define PIN_STROBE 1#define PIN_AUTO 14#define PIN_D0 2#define PIN_D1 3#define PIN_D2 4#define PIN_D3 5#define PIN_D4 6#define PIN_D5 7#define PIN_D6 8#define PIN_D7 9#define PIN_ERROR 15#define PIN_INIT 16#define PIN_SELIN 17#define PIN_ACK 10#define PIN_BUSY 11#define PIN_PE 12#define PIN_SLCT 13这些是对IO口的定义,用于单个IO口的操作,操作函数有以下几个BOOL SetPinLogic(int nPin,BOOL bLogic);//设置指定引脚,bLogic=1高电平,bLogic=0低电平BOOL GetPinLogic(int nPin);//得到指定引脚的电平BOOL SetPinL(int nPin);//设置指定引脚为低电平BOOL SetPinH(int nPin);//设置指定引脚为高电平以上些都是这个并口类的函数了,有了这些,我想大家也就可以随便做点东西了,记得曾有过用并口直接驱动LCD的例子,建议也试一下. 最后一个按钮是流水灯,其实这个对于大家来说并不难,我们也提供一个例子.双击[并口流水灯]添加流水灯代码.IO口低电平有效. void CEg04Dlg::OnBtnLed(){// TODO: Add your control notification handler code hereunsigned char nDataIO=0x01;CString a,b;unsigned char nCData=m_Port.ReadCtrl(); //读控制寄存器数据nCData&=0xDF; //保证第五位为低,使能IO输出m_Port.WriteCtrl(nCData); //写控制口数据for(char i=0;i<8;i++){m_Port.WriteData(0xff-nDataIO);GetDlgItemText(IDC_EDIT_READ,b); //获取编辑框中原有的文本a.Format("\r\n流水灯数据[%d]:%2.2X",i+1,0xff-nDataIO);b+=a;SetDlgItemText(IDC_EDIT_READ,b); //写入文本到编辑框//以下用于将滑块自动移到最后一行unsigned char nLine=((CEdit*)GetDlgItem(IDC_EDIT_READ))->GetLineCount(); ((CEdit*)GetDlgItem(IDC_EDIT_READ))->GetLineCount();((CEdit*)GetDlgItem(IDC_EDIT_READ))->LineScroll(nLine);nDataIO<<=1;Sleep(200); //延时200ms}}接上硬件可以看到,按一下出现一次流水灯效果,由于不方便按硬件,就没有试过了.。

相关文档
最新文档