C++从入门到精通 系列 第16章
- 格式:ppt
- 大小:153.50 KB
- 文档页数:41
第16课总复习课====================================================================== 补充:QT-窗口调用对话框=============================================================================== 归纳:C++编程的套路============================================================================================================================================================== C++知识要点===============================================================================一、容器操作1、排序:vector复合元素,排序规则函数#include <iostream>#include <vector>#include <string>#include <ctime>#include <cstdlib>#include <algorithm>using namespace std;const int n=10000;struct A{int number;int score;};class Sort{private:vector<A>a;public:Sort(){srand(time(0));for(int i=0;i<n;++i)A temp;temp.number=rand();temp.score=rand();a.push_back(temp);}}static bool sort1(A a1,A a2){return a1.number>a2.number;}void browse(){for(int i=0;i<10;++i){cout<<a[i].number<<"-"<<a[i].score<<endl;}}void sort_v(){sort(a.begin(),a.end(),sort1);}};int main(){Sort s;s.sort_v();s.browse();return 0;}-------------------------------------------------------------------------------------------------------2、查找(英汉词典):vector,单元素,遍历#include <iostream>#include <vector>#include <string>#include <fstream>#include <ctime>using namespace std;class Dict{private:vector<string>a;Dict(){string temp;ifstream f("Ó¢ºº´Êµä.txt",ios::in);while(true){getline(f,temp);a.push_back(temp);if(f.eof())break;}}string word1(string s){int n=s.find(" ",0);string temp=s.substr(0,n);return temp;}void find_v(){string word;cout<<"input word:";cin>>word;int i;clock_t t1,t2;t1=clock();for(i=0;i,a.size();++i){if(word==word1(a[i])){cout<<a[i]<<endl;break;}}t2=clock();cout<<"time:"<<t2-t1<<endl;if(i==a.size())cout<<"no word!"<<endl;}};int main(){Dict d;d.find_v();return 0;}-------------------------------------------------------------------------------------------------------3、查找(英汉词典):vector,单元素,find函数,规则函数#include <iostream>#include <vector>#include <string>#include <fstream>#include <algorithm>#include <ctime>using namespace std;struct A{string s;bool operator==(string word){string temp;int n=s.find(" ",0);temp=s.substr(0,n);return (temp==word);}};class Dict{private:vector<A>a;vector<A>::iterator p;public:Dict(){string s;A temp;ifstream f("Ó¢ºº´Êµä.txt",ios::in);while(true){getline(f,s);temp.s=s;a.push_back(temp);if(f.eof())break;}}void find_v(){string word;cout<<"input word:";cin>>word;clock_t t1,t2;t1=clock();p=find(a.begin(),a.end(),word);t2=clock();cout<<"time:"<<t2-t1<<endl;if(p!=a.end()) cout<<p->s<<endl;}};int main(){Dict d;d.find_v();return 0;}-------------------------------------------------------------------------------------------------------4、查找(英汉词典):vector,复合元素,find函数,规则函数#include <iostream>#include <vector>#include <string>#include <fstream>#include <algorithm>#include <ctime>using namespace std;struct A{string word1;string word2;bool operator==(string word){return (word1==word);}};class Dict{private:vector<A>a;vector<A>::iterator p;public:Dict(){string s,s1,s2;A temp;ifstream f("Ó¢ºº´Êµä.txt",ios::in);while(true){getline(f,s);temp.word1=word1(s);temp.word2=word2(s);a.push_back(temp);if(f.eof())break;}}string word1(string s){int n=s.find(" ",0);string temp=s.substr(0,n);return temp;}string word2(string s){int n=s.find(" ",0);while(true){++n;if(s.substr(n,1)!=" ")break;}string temp=s.substr(n,s.size()-n);return temp;}void find_v(){string word;cout<<"input word:";cin>>word;clock_t t1,t2;t1=clock();p=find(a.begin(),a.end(),word);t2=clock();cout<<"time:"<<t2-t1<<endl;if(p!=a.end()) cout<<p->word1+" "+p->word2<<endl;}};int main(){Dict d;d.find_v();return 0;}-------------------------------------------------------------------------------------------------------5、查找(英汉词典):map,a.find函数#include <iostream>#include <map>#include <string>#include <fstream>#include <algorithm>#include <ctime>using namespace std;class Dict{private:map<string,string>a;map<string,string>::iterator p;public:Dict(){string s,s1,s2;ifstream f("Ó¢ºº´Êµä.txt",ios::in);while(true){getline(f,s);s1=word1(s);s2=word2(s);a.insert(pair<string,string>(s1,s2));if(f.eof())break;}}string word1(string s){int n=s.find(" ",0);string temp=s.substr(0,n);return temp;}string word2(string s){int n=s.find(" ",0);while(true){++n;if(s.substr(n,1)!=" ")break;}string temp=s.substr(n,s.size()-n);return temp;}void find_m(){string word;cout<<"input word:";cin>>word;clock_t t1,t2;t1=clock();p=a.find(word);t2=clock();cout<<"time:"<<t2-t1<<endl;if(p!=a.end()) cout<<p->first+" "+p->second<<endl;}};int main(){Dict d;d.find_m();return 0;}===============================================================================二、类的继承与派生1、单线条公有继承2、父类有重载的构造函数3、子类对象的使用=============================================================================== #include <iostream>using namespace std;class point{int x1,y1;public:point(){x1=0;y1=0;}point(int xx1,int yy1){x1=xx1;y1=yy1;}void display(){cout<<"x1="<<x1<<endl;cout<<"y1="<<y1<<endl;}};class line:public point{protected:int x2,y2;public:line(){x2=0;y2=0;}line(int xx1,int yy1,int xx2,int yy2):point(xx1,yy1) {x2=xx2;y2=yy2;}void display(){cout<<"x1="<<x1<<endl;cout<<"y1="<<y1<<endl;cout<<"x2="<<x2<<endl;cout<<"y2="<<y2<<endl;}};int main(){line L1(2,3,4,5);L1.display();}===============================================================================三、运算符重载1、输入/输出2、双目3、单目=============================================================================== //+ 两个线段的顶点坐标分别相加//> 返回较长的线段#include <iostream>using namespace std;class point{protected:int x1,y1;public:point(){x1=0;y1=0;}point(int xx1,int yy1){x1=xx1;y1=yy1;}void display(){cout<<"x1="<<x1<<endl;cout<<"y1="<<y1<<endl;}};class line:public point{protected:int x2,y2;public:line(){x2=0;y2=0;}line(int xx1,int yy1,int xx2,int yy2):point(xx1,yy1){x2=xx2;y2=yy2;}void display(){cout<<"x1="<<x1<<endl;cout<<"y1="<<y1<<endl;cout<<"x2="<<x2<<endl;cout<<"y2="<<y2<<endl;}friend ostream& operator<<(ostream& os,line a){a.display();return os;}line operator +(line L2)//×ø±êÏà¼Ó{line temp;temp.x1=x1+L2.x1;temp.y1=y1+L2.y1;temp.x2=x2+L2.x2;temp.y2=y2+L2.y2;return temp;}bool operator >(line L2)//Ï߶㤶È{bool temp;if(((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))>((L2.x2-L2.x1)*(L2.x2-L2.x1)+(L2.y2-L2.y1)*(L2.y2-L2.y1))) {temp=true;}else{temp=false;}return temp;}};int main()line L1(1,2,3,4);line L2(5,6,7,8);if(L1>L2){cout<<L1;}else{cout<<L2;}return 0;}=============================================================================== 四、类模板if(typeid(T)==tyoeid(int))=============================================================================== #include <iostream>#include <string>#include <sstream>using namespace std;template <class T>class Turn{private:string s;T temp;public:Turn(string ss){s=ss;}T turn(){stringstream ss;ss<<s;ss>>temp;return temp;}};int main()string s="3.5";Turn<double>t(s);cout<<t.turn()+10<<endl;return 0;}=============================================================================== 五、计时器与多线程===============================================================================1、键盘响应2、计时器=============================================================================== #include <windows.h>#include <iostream>#include <ctime>#include <cstdlib>#include <conio.h>using namespace std;class Timer{private:clock_t t1,t2;char c;public:Timer(){t1=clock();t2=clock();c=0;}void gotoxy(int x,int y){HANDLE h;COORD c;c.X=x;c.Y=y;h=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(h,c);}void draw(int x,int y){gotoxy(x,y);cout<<"¡ñ";}void erase(int x,int y){gotoxy(x,y);cout<<" ";}void key(clock_t& t,int tt){if(clock()-t>tt){if(GetAsyncKeyState(VK_ESCAPE)) exit(0);if(GetAsyncKeyState(VK_LEFT)) c=1;if(GetAsyncKeyState(VK_RIGHT)) c=2;t=clock();}}void move1(int& x,int& y,clock_t& t,int tt){if(clock()-t>tt){erase(x,y);switch(c){case 1:--x;break;case 2:++x;break;}if(x<0)x=78;if(x>78)x=0;draw(x,y);t=clock();}}void move(){int x=0,y=10;draw(x,y);while(true){key(t1,10);move1(x,y,t2,30);}}};int main(){Timer t;t.move();return 0;}=============================================================================== 六、文件:二进制文件=============================================================================== #include <iostream>#include <string>#include <fstream>using namespace std;class File{private:fstream f;string s;int len;public:File(){f.open("test.doc",ios::binary|ios::in|ios::out);}~File(){f.close();}void Reverse(){string temp=s;for(int i=0;i<s.size();++i){temp[i]=s[s.size()-i-1];}s=temp;}void Read(){f.seekg(0,ios::end);len=f.tellg();s.resize(len);f.seekg(0,ios::beg);f.read((char*)s.c_str(),len);}void Write(){f.seekp(0,ios::beg);f.write((char*)s.c_str(),s.size());}};int main(){File f;f.Read();f.Reverse();f.Write();return 0;}=============================================================================== 七、练习题===============================================================================1、程序填空(文本文件)2、程序改错字符串与字符数组、类的定义与使用、二进制文件3、给出程序运行结果数组、容器、引用、虚函数。
C语言入门到精通全教程C语言是一门广泛应用于计算机科学和软件开发领域的高级编程语言。
它是一种结构化的、面向过程的语言,具有简单、高效、可移植等特点,被许多计算机平台广泛支持和使用。
本教程将从入门到精通,逐步向您介绍C语言的基本概念、语法规则和常用编程技巧,帮助您从零开始学习和掌握C语言编程。
第一部分:入门篇(300字)1.C语言的历史与特点:简要介绍C语言的起源和发展,以及其在计算机科学中的应用领域和优点。
第二部分:基础篇(400字)1.数据类型和变量:介绍C语言中的基本数据类型和变量的定义、初始化和赋值方法,以及常用的运算符和表达式。
2.流程控制语句:讲解C语言中的条件语句、循环语句和分支语句,并提供实例演示如何使用这些语句实现不同的控制流程。
第三部分:进阶篇(400字)1.数组和指针:介绍数组和指针的概念和用法,包括数组的定义、初始化和访问方法,以及指针的定义、取址和解引用方法。
2.函数和模块化编程:详细介绍函数的定义、参数传递和返回值,以及如何使用函数实现模块化编程,提高代码的复用性和可维护性。
第四部分:高级篇(400字)1.结构体和联合体:讲解结构体和联合体的概念和用法,包括结构体的定义和成员访问方法,以及联合体的定义和内存分配规则。
2. 动态内存管理:介绍动态内存的概念和分配方法,包括malloc、calloc和realloc等函数的使用,以及如何释放动态分配的内存。
第五部分:实战篇(300字)1.文件操作:讲解如何使用C语言进行文件的读写和操作,包括打开文件、读写文件和关闭文件等基本操作。
2.常用库函数:介绍C语言常用的标准库函数,如字符串函数、数学函数和时间函数等,以及如何使用这些函数解决实际问题。
通过本教程的学习,您将逐渐掌握C语言的基本语法和编程技巧,并能够独立编写简单的C程序。
在深入学习和实践中,您还将进一步理解C 语言的内存管理、数据结构和算法等核心概念,从而提高自己的编程能力和解决问题的能力。
C语言入门教程(精华版)C语言是一种广泛使用的计算机编程语言,它被广泛应用于操作系统、嵌入式系统、系统软件和应用程序等领域。
C语言具有高效、灵活和可移植性强的特点,是许多高级编程语言的基础。
本教程旨在帮助初学者快速入门C语言编程,我们将从C语言的基本语法、数据类型、运算符、控制结构等方面进行讲解。
通过本教程的学习,你将能够掌握C语言的基础知识,并能够编写简单的C语言程序。
第一部分:C语言的基本语法1. 预处理器指令:用于在程序编译之前执行一些特定的操作,如包含头文件、定义宏等。
2. 主函数:C语言程序的入口点,程序从这里开始执行。
3. 变量声明:用于声明程序中使用的变量,包括变量的类型和名称。
4. 语句:C语言中的执行单元,用于执行特定的操作,如赋值、输入输出等。
5. 函数:用于实现特定的功能,可以重复使用。
在C语言中,每个语句都以分号(;)结束。
C语言中的注释用于解释代码,单行注释以两个斜杠(//)开始,多行注释以/开始,以/结束。
C语言入门教程(精华版)C语言是一种广泛使用的计算机编程语言,它被广泛应用于操作系统、嵌入式系统、系统软件和应用程序等领域。
C语言具有高效、灵活和可移植性强的特点,是许多高级编程语言的基础。
本教程旨在帮助初学者快速入门C语言编程,我们将从C语言的基本语法、数据类型、运算符、控制结构等方面进行讲解。
通过本教程的学习,你将能够掌握C语言的基础知识,并能够编写简单的C语言程序。
第一部分:C语言的基本语法1. 预处理器指令:用于在程序编译之前执行一些特定的操作,如包含头文件、定义宏等。
2. 主函数:C语言程序的入口点,程序从这里开始执行。
3. 变量声明:用于声明程序中使用的变量,包括变量的类型和名称。
4. 语句:C语言中的执行单元,用于执行特定的操作,如赋值、输入输出等。
5. 函数:用于实现特定的功能,可以重复使用。
在C语言中,每个语句都以分号(;)结束。
C语言中的注释用于解释代码,单行注释以两个斜杠(//)开始,多行注释以/开始,以/结束。
从零开始学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对象等等。