从零开始学VC系列教程 一.信息显示实验
作者:飞雪浪子 QQ:570733482 2008-9-6于深圳
题外话:第一次写教程,不知道该怎么开始.以前见过的教程可能都会介绍比较多的理论然后才开始讲实际操作,我想对于VC,理论讲得太多大家可能更糊涂,所以选择了这个方案,我们先一步步照着做,每一次只介绍一两个知识点,并且把理论放在后面说明,希望大家能喜欢这种方式,并对这种方式提出意见和建议,以便以后章节更适合大家的学习.
或许我写的还不能称之为教程,只是一些操作步骤及说明,通过这些练习,希望能使大家对VC有一个新的认识.VC的功能是十分强大的,但我们一般并不会用到所有的功能,就像大家熟悉的KeilC一样,其实Keil功能也是很多的,平时也没见谁把Keil的功能都用到了.基于此,我写的这个教程可能在VC专业人士看来比较简单.不是要班门弄斧,而是希望推行上位机技术,形成一个氛围让大家来学习交流,PC机与下位机结合毕竟也是发展的一个方向.望高手谅解小辈的不自量力.同时,我们结合单片机编程,让大家明白上位机控制方法及原理,当然这是今后章节的内容了.
本节内容:学会在文本框中显示文本,学会弹出式对话框使用.
学习目的:信息显示是人机交互的基础,同时,信息显示也为以后的程序调试打下基础.
1.新建工程.打开VC6.0点击[文件]->[新建],弹出如下对话框.
图1
(原文件名:01.JPG)
在工程选项中选择MFC AppWizard[exe],选择好工程存入的位置,然后在工程名称中填入工程的名称,例如Eg01,填入Eg01后.VC会在我们选择的路径后自动加入一个以工程名命名的文件夹作为工程目录.完成按[确定]就会进入工程向导,出现以下的提示.
图2
(原文件名:02.JPG)
在这个我们选择[基于对话框]就行了.单文档及多文档方式会在以后详细介绍.这里也简要说明一下.①单文档.程序一次只能处理一个文档对象(文件).像写字板,记事本等.②多文档.程序一次可以处理多个对象(文件),像word之类的,可以同时打开多个文件.③基本对话框.程序一般用于处理一些比较小的,工珍具型的软件.像双龙的ISP下载软件, Easy 51Pro等都是基于对话框.一些不是很复杂的工业软件也通常可以用基于对话框的形式,这种方式的优点是所见即所得,一些控件可以像VB一样拖到工作区就行了.选好以后直接按[完成]就可以了.至于[下一步]的向导,这里我们先不管.然后会进入以下的画面.其中红色及绿色是我的标注,看不清图片可以下载图片放大.
图3
(原文件名:03.JPG)
选中静态文本框[TODO:在这里设置对话框控制],单击指标右键,在弹出的快捷菜单中选择[属性Properties]菜单项,弹出如下对话框
图4
(原文件名:04.JPG)
修改IDC_STATIC为IDC_FIRSTLABEL,标题可以写为”第一个应用程序”然后关闭这个对话框,就可以看到刚才的静态文本框内容变为”第一个应用程序”了.
在刚才的操作中,我们将静态文本框的ID改为了IDC_FIRSTLABEL,在VC中,ID是控件的标志,不能有相同的ID出现,但允许多个名为IDC_STATIC的ID号.所以,一般并不把近件名命为IDC_STATIC,除非以后我们不想在程序中改变这个控件的属性.有一些控制,例如GroupBox一般并不在程序中改变什么,所以不改变其ID号.ID是程序访问控件的标识,所以一个应用程序中不能有重复ID.
按下来我们要添加一个按钮.
用鼠标将控件条上的按钮拖到对话框上,可以看到对话框上多了一个按钮. 用上叙方法,改变按钮ID为IDC_BTN1,标题改为”显示”,这样就做好一个按钮了.下面
图5
(原文件名:05.JPG)
我们为按钮添加代码.
双击按钮,会出现以下的提示框.
图6
(原文件名:06.JPG)
按[OK]为按钮添加响应函数,出面以下画面
图7
(原文件名:07.JPG)
void CEg01Dlg::OnBtn1()
{
// TODO: Add your control notification handler code here
}
这一段就是刚才按钮的函数了.当然,现在还没有响应.现在我们添加一个事件,让这个按钮按下后上面的静态文本框的内容变为”串口号:COM1 波特率:57600”把上面的代码改为
void CEg01Dlg::OnBtn1()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_FIRSTLABEL,” 串口号:COM1 波特率:57600”);
}
添加完成以后,按F7编译.如果编译通过,按F5运行,可以看到程序运行后的对话框
图8
(原文件名:08.JPG)
按下按钮,可以看到上面的静态文本框的内容改变了.那么恭喜你,完成我们这个例子的第一步操作了.
图9
(原文件名:09.JPG)
当然,我这里的对话框看起来没那么高,大家可以调一下高度.怎么退回到控件编辑状态呢?
图10
(原文件名:10.JPG)
首先,我们单击选项卡中的[ResorceView],现在大家只能看到[Reso…]看到IDD_EG01_DIALG了吧,这个其实也是一个ID,是我们对话框的ID,如果大家改一下对话框的ID,就可以看到这里的ID也变了.在VC中,所有的控件都认为是窗体,只是形式不同.双击IDD_EG01_DIALG就可以看到我们刚才的控制编辑状态了.双击[显示]按钮又可以回到代码状态.
刚才的例子很简单,却是我们以后会用得最多的.下面我们来分析一下代码
void CEg01Dlg::OnBtn1()
{
// TODO: Add your control notification handler code here
SetDlgItemText (IDC_FIRSTLABEL,” 串口号:COM1 波特率:57600”);
}
看看SetDlgItemText这个函数,大家就会明白了, IDC_FIRSTLABEL是我们给静态文本框分配的ID,后面的参数是要显示的内容.上面我们提到过,VC中的控件都认为是窗体,所以,对于所有的文本显示,我们都可以用这个函数来做,大家可以试着加入一个编辑框(Edit),同样可以使用用这个函数,只要ID号对了就可以了.VC对大小写敏感,大家要注意大小写.
下面我们用另一个方法来实现.
把代码改为
void CEg01Dlg::OnBtn1()
{
// TODO: Add your control notification handler code here
CString a;
a=” 串口号:COM1 波特率:57600”;
SetDlgItemText (IDC_FIRSTLABEL,a);
}
然后按F7编译,无误则按F5运行.可以看到运行结果是一样的.
大家可以看到,我们把变量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=a.GetLength();来获得这个字符串的长度.从这句可以看到,GetLength()是类CString里的一个函数.大家可能又会关心一个问题,怎么把长度显示出来呢?我们把代码改为
void CEg01Dlg::OnBtn1()
{
// TODO: Add your control notification handler code here
CString a;
a=" 串口号:COM1 波特率:57600";
SetDlgItemText (IDC_FIRSTLABEL,a);
a.Format("字符串的长度:%d",a.GetLength());
MessageBox(a);
}
运行一下,效果如下
图11
(原文件名:11.JPG)
这里我们用到了类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(“大家好”);是不是很简单啊?
这一章就写到这里了,一些问题大家可以提.未尽知识点,会在以后再详细介绍.
下面是整个工程及放大片的下载