从零开始学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、多看书,少买书,买书前一定要慎重。

跟我学VS#语言编程技术——Visual C#中的类与对象编程

跟我学VS#语言编程技术——Visual C#中的类与对象编程
} } (4)将当前对象作为参数传递到其他方法时也要用 this 表达。
CalcTax(this); (5)声明索引器时 this 更是不可或缺,例如: public int this [int param]{ //声明一个索引器并带有一个 int 参数
get{ return array[param];
1.1.2 C#中的对象及定义语法
1、对象的定义 它是具有该类的类型的一个实例。
2、定义语法 类名 对象名;
3、对象实例化 实例化后的类型称之为对象,其核心特征便是拥有了一份自己特有的数据成员拷贝。实
例化对象采用 MyClass myObject=new MyClass()语法(new 将触发调用相应的构造函数,C# 中的所有的对象都将创建在堆上)。 4、使用对象
对象的字符串--缺省时为类名)。如:
Object obj=new Point(); Console.WriteLine("ToString:{0}",obj.ToString()); //显示为 Point Console.WriteLine("ToString:{0}",obj.GetType()); //显示为 Point (2)应用实例 将数据值隐含地转换为 object 类型的对象。
主要分为成员访问修饰符(public、protected、internal、private)和类型修饰符(abstract、 new 、sealed)两种。 3、abstract 类:包含抽象方法的类 (1) 编程特性
抽象类一般是作为父类被用于继承,而不能进行对象实例化;抽象类可以包含抽象的成
员,也可以包含其它方法;abstract 不能和 sealed 同时使用;其子类必须实现抽象类中的所有 的抽象方法。

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

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

从零开始学V C系列教程完整版Corporation standardization office #QS8QHH-HHGX8Q8-GNHHJ8从零开始学VC系列教程一.信息显示实验题外话:第一次写教程,不知道该怎么开始.以前见过的教程可能都会介绍比较多的理论然后才开始讲实际操作,我想对于VC,理论讲得太多大家可能更糊涂,所以选择了这个方案,我们先一步步照着做,每一次只介绍一两个知识点,并且把理论放在后面说明,希望大家能喜欢这种方式,并对这种方式提出意见和建议,以便以后章节更适合大家的学习.或许我写的还不能称之为教程,只是一些操作步骤及说明,通过这些练习,希望能使大家对VC有一个新的认识.VC的功能是十分强大的,但我们一般并不会用到所有的功能,就像大家熟悉的KeilC一样,其实Keil功能也是很多的,平时也没见谁把Keil的功能都用到了.基于此,我写的这个教程可能在VC专业人士看来比较简单.不是要班门弄斧,而是希望推行上位机技术,形成一个氛围让大家来学习交流,PC机与下位机结合毕竟也是发展的一个方向.望高手谅解小辈的不自量力.同时,我们结合单片机编程,让大家明白上位机控制方法及原理,当然这是今后章节的内容了.本节内容:学会在文本框中显示文本,学会弹出式对话框使用.学习目的:信息显示是人机交互的基础,同时,信息显示也为以后的程序调试打下基础.1.新建工程.打开点击[文件]->[新建],弹出如下对话框.在工程选项中选择MFCAppWizard[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++6.0之并口控制(第一课环境配置)标签:VC++6.0并口控制2013-01-24 21:31 2673人阅读评论(4) 收藏举报分类:步进电机控制(12) 25针并口控制(8) VC6++语言(8)版权声明:本文为博主原创文章,未经博主允许不得转载。

从零开始学习C++6.0之并口控制第一课环境配置1、软件硬件的准备我用的是一台旧笔记本(带25针并口),WindowsXP sp3操作系统,Microsoft C++6.0是从网上随意下载的简体中文企业版,以下是从帮助菜单打开的版本信息:同时准备一根25针的并口连接线(两头都是针的)、万用表(用来量针脚高低电压值),但为了后面学习控制普通直流电机和步进电机,还需要其他接口板,后面再说这个问题。

2、由于WindowsXP操作系统的限制,需要下载第三方IO接口驱动库才能顺利进行并口的控制学习,从网上下载Yario Kaplan编写的WinIO库,一共需要5个文件,以下是这5个文件的列表:(需要下载的请发邮件178268235@或QQ:178268235)3、配置(非常重要)以下配置步骤是在新建工程以后再做,必须要做的第一步:将WinIo.h和WinIo.lib两个文件要拷贝在工程根目录下;第二步:将WinIo.vxd、WinIo.sys、WinIo.dll三个文件拷贝到工程Debug子目录下,否则并口的控制不会成功的。

第三步:打开工作区“FileView”-“Header Files”-“StdAfx.h”文件(这个文件是任何工程都固定生成有的,称为头文件预编译,定义了一些环境参,要了解详情自己上网百度就可以了),在最后面加入一条语句:#include "winio.h"第四步:连接Winio.lib库文件打开菜单“工程”-“设置”,在弹出的Project Settings设置窗口选择“连接”标签,在“常规”分类第二行“对象/库模块:”中输入“WinIo.lib”,确定就可以了。

C++Primer第四版阅读笔记第四部分“面向对象编程与泛型编程”

C++Primer第四版阅读笔记第四部分“面向对象编程与泛型编程”

C++Primer第四版阅读笔记第四部分“⾯向对象编程与泛型编程”继承和动态绑定与数据抽象⼀起成为⾯向对象编程的基础。

模板使我们能够编写独⽴于具体类型的泛型类和泛型函数。

第15章⾯向对象编程⾯向对象编程基于三个基本概念:数据抽象、继承和动态绑定。

在C++中,⽤类进⾏数据抽象,⽤派⽣类从⼀个类继承另⼀个类:派⽣类继承基类的成员。

动态绑定使编译器能够在运⾏时决定是使⽤基类中定义的函数还是派⽣类中定义的函数。

继承和动态绑定在两个⽅⾯简化了我们的程序:能够容易地定义与其他类相似但⼜不相同的新类,能够更容易地编写忽略这些相似类型之间区别的程序。

⾯向对象编程的关键思想是多态性。

在C++中,多态性仅⽤于通过继承⽽相关联的类型的引⽤或指针。

派⽣类能够继承基类定义的成员,派⽣类可以⽆须改变⽽使⽤那些与派⽣类型具体特性不相关的操作,派⽣类可以重定义那些与派⽣类型相关的成员函数,将函数特化,考虑派⽣类型的特性。

在C++中,基类必须指出希望派⽣类重定义哪些函数,定义为virtual的函数是基类期待派⽣类重新定义的,基类希望派⽣类继承的函数不能定义为虚函数。

通过动态绑定我们能够编写程序使⽤继承层次中任意类型的对象,⽆须关⼼对象的具体类型。

使⽤这些类的程序⽆须区分函数是在基类还是在派⽣类中定义的。

在C++中,通过基类的引⽤(或指针)调⽤虚函数时,发⽣动态绑定。

引⽤(或指针)既可以指向基类对象也可以指向派⽣类对象,这⼀事实是动态绑定的关键。

保留字 virtual 的⽬的是启动动态绑定。

保留字 virtual 只在类内部的成员函数声明中出现,不能⽤在类定义体外部出现的函数定义上。

派⽣类可以访问基类的 public 成员⽽不能访问 private 成员。

protected 成员可以被派⽣类对象访问但不能被该类型的普通⽤户访问。

(注意:这⾥都是访问2字,不是继承)派⽣类只能通过派⽣类对象访问其基类的 protected 成员,派⽣类对其基类类型对象的 protected 成员没有特殊访问权限。

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

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

从零开始学VC系列教程之四并口控制与类的使用从零开始学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位控制数据位是否能够输出。

可编程控制器基础教程(四)

可编程控制器基础教程(四)

56
2021/6/7
57

2021/6/7
58
2021/6/7
59
2021/6/7
60
2021/6/7
61
2021/6/7
62
2021/6/7
63
2021/6/7
64
2021/6/7
65
2021/6/7
66
2021/6/7
67
2021/6/7
68
2021/6/7
69
2021/6/7
42
2021/6/7
43
2021/6/7
44
2021/6/7
45
2021/6/7
46
2021/6/7
47
2021/6/7
48
2021/6/7
49
2021/6/7
50
2021/6/7
51
2021/6/7
52
2021/6/7
53
2021/6/7
54
2021/6/7
55

2021/6/7
遇 到你之 前,我 不谙爱 情,曾 认为张 爱玲爱 一个人 低到尘 埃里的 说法是 愚昧可 笑。 在 尊 严 面 前 ,男欢 女爱又 怎么敌 的过它 的高贵 ?2014年 1月5号 ,你 的出现 让一切 都 变了。 谦谦君 子,温 润如玉 。我的 心和大 脑一起 被你的 温柔折 服,像 过了电 般。
溺 死在你 的温柔 之中。 校 园太大 了,不 是同届 ,作息 又不一 样的我 们太难 相遇了 。偶然 的遇见 打个招 呼 对 我 来 说 都 像上天 的恩赐 一样。 15年冬 季是我 最幸福 的时光 ,因为 我可以 在考研 教 室外面 常常遇 到你。 你静静 地刷题 为未来 努力着 ,冬阳 懒懒地 伸进屋 内。我 心

C#程序设计教程 (4)

C#程序设计教程 (4)

面向对象的基本概念
面向对象的程序设计(OOP)是一种基于结构分析的、以 数据为中心的程序设计方法。
面向对象的程序设计方法总体思路:将数据及处理这些数 据的操作都封装(Encapsulation)到一个称为类(Class) 的数据结构中,在程序中使用的是类的实例——对象。 对象是代码与数据的集合,是封装好了的一个整体,对象 具有一定的功能。也就是说对象是具有一定功能的程序实体。 程序是由一个个对象构成的,对象之间通过一定的“相互操 作”传递消息,在消息的作用下,完成特定的功能。
多态(Polymorphism ):多态的意思是事物 具有不同形式的能力。例如,对不同的实例, 某个操作可能会有不同的行为。这个行为依赖 于所要操作数据的类型。 多态机制使具有不同内部结构的对象可以共享 相同的外部接口。 多态的实现
重载(overload) 覆盖(override)
4. 2 类









public class teacher { int no; string name; public int No { get { return no; } set { no = value; } } public string Name { get { return name; }
静态类,不能实例化,不能被继承
部分类,一个类的代码可以放在多 个文件中,编译时再将它们合并
类的成员
类成员
常量 字段 方法 类中的变量 类中的函数,完成特定的功能
说明
与类相关的常量值
属性
事件
对类的字段提供安全访问
用于说明发生了什么事情
索引器
运算符

C#操作并口类,并口通信

C#操作并口类,并口通信

C#操作并⼝类,并⼝通信c#已提供了串⼝通信组件SerialPort,但是C#并没有提供直接的并⼝通信组件,只好通过调⽤API来与并⼝通信代码1using System;2using System.Runtime.InteropServices;3namespace LptPrint_test4 {5///<summary>6/// LPTControl 的摘要说明。

7///</summary>8public class LPTControl9 {10private string LptStr = "lpt1";11public LPTControl(string l_LPT_Str)12 {13//14 // TODO: 在此处添加构造函数逻辑15 //16 LptStr = l_LPT_Str;17 }18 [StructLayout(LayoutKind.Sequential)]19private struct OVERLAPPED20 {21int Internal;22int InternalHigh;23int Offset;24int OffSetHigh;25int hEvent;26 }27 [DllImport("kernel32.dll")]28private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);29 [DllImport("kernel32.dll")]30private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, ref OVERLAPPED lpOverlapped);31 [DllImport("kernel32.dll")]32private static extern bool CloseHandle(int hObject);33private int iHandle;34public bool Open()35 {36 iHandle = CreateFile(LptStr, 0x40000000, 0, 0, 3, 0, 0);37if (iHandle != - 1)38 {39return true;40 }41else42 {43return false;44 }45 }46public bool Write(String Mystring)47 {48if (iHandle != - 1)49 {50 OVERLAPPED x = new OVERLAPPED();51int i = 0;52byte[] mybyte = System.Text.Encoding.Default.GetBytes(Mystring);53bool b = WriteFile(iHandle, mybyte, mybyte.Length, ref i, ref x);54return b;55 }56else57 {58throw new Exception("不能连接到打印机!");59 }60 }61public bool Write(byte[] mybyte)62 {63if (iHandle != - 1)64 {65 OVERLAPPED x = new OVERLAPPED();66int i = 0;67 WriteFile(iHandle, mybyte, mybyte.Length, ref i, ref x);68return true;69 }70else71 {72throw new Exception("不能连接到打印机!");73 }74 }75public bool Close()76 {77return CloseHandle(iHandle);78 }79 }80 }8182。

C#入门经典第4版目录

C#入门经典第4版目录

第Ⅰ部分 C# 语言第1章 C#简介 31.1 什么是.NET Framework 31.1.1 .NET Framework的内容 41.1.2 如何用.NET Framework编写应用程序 41.2 什么是C# 71.2.1 用C#能编写什么样的应用程序 71.2.2 本书中的C# 81.3 Visual Studio 2005 81.3.1 Visual Studio 2005 Express产品 81.3.2 VS解决方案 91.4 小结 9第2章编写C#程序 102.1 Visual Studio 2005开发环境 102.2 控制台应用程序 132.2.1 Solution Explorer 152.2.2 Properties窗口 162.2.3 Error List窗口 162.3 Windows Forms应用程序 172.4 小结 20第3章变量和表达式 223.1 C#的基本语法 223.2 变量 263.2.1 简单类型 263.2.2 变量的命名 303.2.3 字面值 313.2.4 变量的声明和赋值 333.3 表达式 343.3.1 数学运算符 343.3.2 赋值运算符 383.3.3 运算符的优先级 393.3.4 命名空间 393.4 小结 423.5 练习 43第4章流程控制 444.1 布尔逻辑 444.1.1 位运算符 464.1.2 布尔赋值运算符 504.1.3 运算符的优先级更新 514.2 goto语句 524.3 分支 534.3.1 三元运算符 534.3.2 if语句 544.3.3 switch语句 574.4 循环 604.4.1 do循环 614.4.2 while循环 634.4.3 for循环 654.4.4 循环的中断 694.4.5 无限循环 704.5 小结 714.6 练习 71第5章变量的更多内容 735.1 类型转换 735.1.1 隐式转换 735.1.2 显式转换 755.1.3 使用Convert命令进行显式转换 775.2 复杂的变量类型 805.2.1 枚举 815.2.2 结构 855.2.3 数组 875.3 字符串的处理 945.4 小结 985.5 练习 98第6章函数 1006.1 定义和使用函数 1016.1.1 返回值 1026.1.2 参数 1046.2 变量的作用域 1116.2.1 其他结构中变量的作用域 113 6.2.2 参数和返回值与全局数据 115 6.3 Main()函数 1166.4 结构函数 1196.5 函数的重载 1206.6 委托 1216.7 小结 1246.8 练习 124第7章调试和错误处理 1267.1 Visual Studio中的调试 1267.1.1 非中断(正常)模式下的调试 127 7.1.2 中断模式下的调试 1347.2 错误处理 1437.3 小结 1497.4 练习 150第8章面向对象编程简介 1518.1 什么是面向对象编程 1518.1.1 什么是对象 1528.1.2 所有的东西都是对象 1548.1.3 对象的生命周期 1558.1.4 静态和实例类成员 1568.2 OOP技术 1568.2.1 接口 1578.2.2 继承 1588.2.3 多态性 1608.2.4 对象之间的关系 1618.2.5 运算符重载 1638.2.6 事件 1638.2.7 引用类型和值类型 1638.3 Windows应用程序中的OOP 164 8.4 小结 1668.5 练习 167第9章定义类 1689.1 C#中的类定义 1689.2 System.Object 1739.3 构造函数和析构函数 1749.4 Visual Studio 2005中的OOP工具 1789.4.1 Class View窗口 1789.4.2 对象浏览器 1819.4.3 添加类 1829.4.4 类图 1839.5 类库项目 1849.6 接口和抽象类 1879.7 结构类型 1899.8 小结 1919.9 练习 192第10章定义类成员 19310.1 成员定义 19310.1.1 定义字段 19310.1.2 定义方法 19410.1.3 定义属性 19510.1.4 在类图中添加成员 20010.1.5 重制成员 20210.2 类成员的其他议题 20310.2.1 隐藏基类方法 20310.2.2 调用重写或隐藏的基类方法 20510.2.3 嵌套的类型定义 20610.3 接口的实现 20710.4 部分类定义 21010.5 示例应用程序 21210.5.1 规划应用程序 21210.5.2 编写类库 21310.5.3 类库的客户应用程序 21910.6 小结 22010.7 练习 221第11章集合、比较和转换 22211.1 集合 22211.1.1 使用集合 22311.1.2 定义集合 22911.1.3 索引符 23011.1.4 给CardLib添加Cards集合 232 11.1.5 关键字值集合和IDictionary 23511.1.6 迭代器 23611.1.7 深度复制 24111.1.8 给CardLib添加深度复制 243 11.2 比较 24511.2.1 类型比较 24511.2.2 值比较 25011.3 转换 26611.3.1 重载转换运算符 26611.3.2 as运算符 26711.4 小结 26811.5 练习 269第12章泛型 27112.1 泛型的概念 27112.2 使用泛型 27212.2.1 可空类型 27212.2.2 System.Collections. Generic 命名空间 27912.3 定义泛型 28812.3.1 定义泛型类 28812.3.2 定义泛型接口 30012.3.3 定义泛型方法 30012.3.4 定义泛型委托 30212.4 小结 30212.5 练习 303第13章其他OOP技术 30413.1 ::运算符和全局命名空间限定符 30413.2 定制异常 30513.3 事件 30713.3.1 什么是事件 30713.3.2 使用事件 30913.3.3 定义事件 31113.4 扩展和使用CardLib 31913.5 小结 32613.6 练习 327第Ⅱ部分 Windows 编程第14章 Windows编程基础 33114.1 控件 33114.1.1 属性 33214.1.2 控件的定位、停靠和对齐 333 14.1.3 事件 33414.2 Button控件 33614.2.1 Button控件的属性 33714.2.2 Button控件的事件 33714.3 Label和LinkLabel控件 33914.4 TextBox控件 34014.4.1 TextBox控件的属性 34014.4.2 TextBox控件的事件 34114.5 RadioButton和CheckBox控件 34814.5.1 RadioButton控件的属性 349 14.5.2 RadioButton控件的事件 349 14.5.3 CheckBox控件的属性 34914.5.4 CheckBox控件的事件 35014.5.5 GroupBox控件 35014.6 RichTextBox控件 35414.6.1 RichTextBox控件的属性 354 14.6.2 RichTextBox控件的事件 355 14.7 ListBox和CheckedListBox控件 36014.7.1 ListBox控件的属性 36014.7.2 ListBox控件的方法 36114.7.3 ListBox控件的事件 36214.8 ListView控件 36514.8.1 ListView控件的属性 36514.8.2 ListView控件的方法 36714.8.3 ListView控件的事件 36714.8.4 ListViewItem 36814.8.5 ColumnHeader 36814.8.6 ImageList控件 36814.9 TabControl控件 37514.9.1 TabControl控件的属性 376 14.9.2 使用TabControl控件 37614.10 小结 37814.11 练习 379第15章 Windows Forms的高级功能 380 15.1 菜单和工具栏 38015.1.1 两个实质一样的控件 38015.1.2 使用MenuStrip控件 38115.1.3 手工创建菜单 38115.1.4 ToolStripMenuItem控件的其他属性 38415.1.5 给菜单添加功能 38415.2 工具栏 38615.2.1 ToolStrip控件的属性 387 15.2.2 ToolStrip的项 38715.2.3 StatusStrip控件 39215.2.4 StatusStripStatusLabel的属性 39215.3 SDI和MDI应用程序 39415.4 创建控件 40315.4.1 调试用户控件 40915.4.2 扩展LabelTextbox控件 410 15.5 小结 41215.6 练习 413第16章使用通用对话框 41416.1 对话框 41416.2 如何使用对话框 41516.3 文件对话框 41616.3.1 OpenFileDialog 41616.3.2 SaveFileDialog 42716.4 打印 43216.4.1 打印结构 43216.4.2 打印多个页面 43716.4.3 PageSetupDialog 43916.4.4 PrintDialog 44216.5 打印预览 44616.5.1 PrintPreviewDialog 446 16.5.2 PrintPreviewControl 446 16.6 FontDialog和ColorDialog 447 16.6.1 FontDialog 44716.6.2 ColorDialog 44916.6.3 FolderBrowserDialog 450 16.7 小结 45116.8 练习 452第17章部署Windows应用程序 453 17.1 部署概述 45317.2 ClickOnce 部署 45417.3 Visual Studio安装和部署项目类型 46317.4 Microsoft Windows安装程序结构 46417.4.1 Windows Installer术语 464 17.4.2 Windows Installer的优点 466 17.5 为Simple Editor创建安装软件包 46617.5.1 规划安装内容 46717.5.2 创建项目 46717.5.3 项目属性 46817.5.4 安装编辑器 47017.5.5 File System编辑器 47117.5.6 File Types编辑器 47417.5.7 Launch Condition编辑器 475 17.5.8 User Interface编辑器 476 17.6 构建项目 47917.7 安装 47917.7.1 Welcome 48017.7.2 Read Me 48117.7.3 License Agreement 48117.7.4 Optional Files 48117.7.5 选择安装文件夹 48217.7.6 确认安装 48317.7.7 进度 48317.7.8 结束安装 48417.7.9 运行应用程序 48417.7.10 卸载 48417.8 小结 48417.9 练习 485第Ⅲ部分 Web 编程第18章 Web编程基础 48918.1 概述 48918.2 运行库 49018.3 创建简单的Web页面 49018.4 服务器控件 49618.5 事件处理程序 49718.6 输入的有效性验证 50218.7 状态管理 50518.7.1 客户端的状态管理 50618.7.2 服务器端的状态管理 508 18.8 身份验证和授权 51018.8.1 身份验证的配置 51118.8.2 使用安全控件 51518.9 读写SQL Server数据库 517 18.10 小结 52518.11 练习 525第19章 Web高级编程 52619.1 示例站点 52619.2 主页 52719.3 站点导航 53319.4 用户控件 53519.5 个性化配置 53719.5.1 个性化配置组 53819.5.2 组件的个性化配置 53919.5.3 定制数据类型中的个性化配置 53919.5.4 匿名用户的个性化配置 540 19.6 Web Parts 54119.6.1 Web Parts管理器 54219.6.2 Web Parts区域 54219.6.3 Editor区域 54419.6.4 Catalog区域 54619.6.5 Connections区域 54819.7 小结 55019.8 练习 551第20章 Web服务 55220.1 Web服务推出之前 55220.1.1 远程过程调用(RPC) 55320.1.2 SOAP 55320.2 使用Web服务的场合 55420.2.1 宾馆旅行社代理应用程序 554 20.2.2 书籍发布应用程序 55520.2.3 客户应用程序的类型 555 20.2.4 应用程序的体系结构 555 20.3 Web服务的体系结构 55620.3.1 Web服务的搜索引擎 55720.3.2 可以调用的方法 55820.3.3 调用方法 55920.3.4 SOAP和防火墙 56120.3.5 WS-I基本个性化配置 56120.4 Web服务和.NET Framework 56120.4.1 创建Web服务 56120.4.2 客户程序 56320.5 创建一个简单的Web服务 56420.5.1 生成的文件 56420.5.2 添加Web方法 56520.6 测试Web服务 56620.7 执行Windows客户程序 56720.8 异步调用服务 57020.9 执行客户程序 57220.10 传送数据 57220.11 小结 57520.12 练习 576第21章部署Web应用程序 57721.1 Internet Information Services 577 21.2 IIS配置 57821.3 复制Web站点 58221.4 预编译Web站点 58321.5 Windows安装程序 58421.5.1 创建安装程序 58421.5.2 安装Web 应用程序 58621.6 小结 58821.7 练习 589第Ⅳ部分数据访问第22章文件系统数据 59322.1 流 59322.2 用于输入和输出的类 59422.2.1 File和Directory类 59522.2.2 FileInfo类 59622.2.3 DirectoryInfo类 59722.2.4 FileStream对象 59822.2.5 StreamWriter对象 60422.2.6 StreamReader对象 60622.2.7 读写压缩文件 61222.3 串行化对象 61622.4 监控文件结构 62022.5 小结 62622.6 练习 627第23章 XML 62823.1 XML文档 62823.1.1 XML元素 62823.1.2 属性 62923.1.3 XML声明 63023.1.4 XML文档的结构 63023.1.5 XML命名空间 63123.1.6 格式良好并有效的XML 63223.1.7 验证XML文档 63223.2 在应用程序中使用XML 63723.2.1 XML文档对象模型 63723.2.2 选择节点 64623.3 小结 65423.4 练习 654第24章数据库和 65524.1 概述 65524.1.1 名称的来源 65524.1.2 的设计目标 65624.2 类和对象概述 65724.2.1 提供者对象 65824.2.2 用户对象 65924.2.3 使用System.Data命名空间 659 24.3 安装SQL Server和Northwind示例数据 66024.3.1 安装SQL Express 66124.3.2 安装Northwind示例数据库 66124.4 用DataReader读取数据 66224.5 用DataSet读取数据 66824.5.1 用数据填充DataSet 66824.5.2 访问DataSet中的表、行和列 66824.6 更新数据库 67124.6.1 给数据库添加行 67524.6.2 删除行 68124.7 在DataSet中访问多个表 683 24.7.1 中的关系 68324.7.2 导航关系 68424.8 XML和 69124.9 中的SQL支持 69424.9.1 DataAdapter对象中的SQL命令 69424.9.2 直接执行SQL命令 69725.9.3 调用SQL存储过程 69924.10 小结 70124.11 练习 702第25章数据绑定 70325.1 安装SQL Server和示例数据 703 25.2 创建VS数据库项目 70325.2.1 数据库对象 70625.2.2 浏览数据库表和关系 70725.3 给应用程序添加数据源 70925.4 添加DataGridView 71525.4.1 格式化DataGridView 71625.4.2 添加不同类型的控件 71825.4.3 查看生成的代码 71925.4.4 更新数据库 72025.5 小结 72125.6 练习 721第Ⅴ部分其他技术第26章 .NET程序集 72526.1 组件 72526.1.1 组件的优点 72626.1.2 组件的简史 72626.2 .NET程序集的功能 72726.2.1 自说明性 72726.2.2 .NET程序集和.NETFramework类库 72726.2.3 跨语言的程序设计 72826.2.4 与COM和其他旧代码的交互操作 72826.3 程序集的结构 72926.3.1 查看程序集的内容 73126.3.2 清单 73426.3.3 程序集属性 73726.4 调用程序集 74126.5 私有和共享程序集 74426.5.1 私有程序集 74426.5.2 共享程序集 74426.5.3 搜索程序集 74826.6 小结 74826.7 练习 749第27章属性 75027.1 什么是属性 75027.2 反射 75327.3 内置属性 75627.3.1 System.Diagnostics.Condi tionalAttribute 75727.3.2 System.ObsoleteAttribute 759 27.3.3 System.SerializableAttribute 760 27.3.4 System.Reflection.Assembly DelaySignAttribute 76227.4 定制属性 76627.4.1 TestCaseAttribute 76627.4.2 System.AttributeUsageAttribute 77027.4.3 使用属性生成数据库表 77627.5 小结 790第28章 XML文档说明 79128.1 添加XML文档说明 79128.1.1 XML文档说明的注释 79328.1.2 使用类图添加XML文档说明 79928.1.3 生成XML文档说明文件 80228.1.4 带有XML文档说明的应用程序示例 80528.2 使用XML文档说明 80728.2.1 编程处理XML文档说明 80728.2.2 用XSLT格式化XML文档说明 80928.2.3 NDoc 81028.3 小结 81128.4 练习 811第29章网络 81229.1 联网概述 81229.1.1 名称的解析 81429.1.2 统一资源标识符 81629.1.3 TCP和UDP 81729.1.4 应用协议 81729.2 网络编程选项 81829.3 WebClient 81929.4 WebRequest和WebResponse 821 29.5 TcpListener和TcpClient 828 29.6 小结 83529.7 练习 836第30章 GDI+简介 83730.1 图形绘制概述 83730.1.1 Graphics类 83830.1.2 对象的删除 83830.1.3 坐标系统 83930.1.4 颜色 84630.2 使用Pen类绘制线条 84730.3 使用Brush 类绘制图形 84930.4 使用Font 类绘制文本 85130.5 使用图像进行绘制 85530.5.1 使用纹理画笔进行绘图 857 30.5.2 使用钢笔绘制图像 85830.5.3 双倍缓冲 86030.6 GDI+的高级功能 86230.6.1 剪切 86230.6.2 System.Drawing.Drawing2D 863 30.6.3 System.Drawing.Imaging 864 30.7 小结 86430.8 练习 864。

  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}}接上硬件可以看到,按一下出现一次流水灯效果,由于不方便按硬件,就没有试过了.。

相关文档
最新文档