vc++基础教程 第4章
VisualC++_04
第4章 键盘和鼠标教学重点1、键盘消息的处理WM_KEYDOWN, WM_KEYUP、WM_CHAR,字参数、长字参数意义2、鼠标消息处理字参数、长字参数意义以及处理方法3、定时器消息API编程WM_TIMER第4章 键盘和鼠标4.1 键盘消息编程---扫描码和虚拟码扫描码:键盘上的键的唯一标识值,设备相关。
虚拟码:Windows系统定义的键标识,设备无关。
它的值存放在键盘消息的wParam参数中,用以标识哪一个键被按下或释放。
第4章 键盘和鼠标4.1 键盘消息编程---常用的虚拟码符号常量名称 说明 符号常量名称 说明 VK_LBUTTON 鼠标左按钮 VK_BACK 退格键 VK_RBUTTON 鼠标右按钮 VK_TAB 制表键 VK_MBUTTON 鼠标中按钮 VK_RETURN 回车键 VK_SHIFT Shift键 VK_CONTROL Ctrl键 VK_MENU Alt键 VK_PAUSE Pause键第4章 键盘和鼠标4.1 键盘消息编程---常用的虚拟码符号常量名称 说明 符号常量名称 说明 VK_CAPITAL Caps Lock键VK_ESCAPE Esc键 VK_PRIOR Page Up键 VK_NEXT PageDown键VK_END End键 VK_HOME Home键 VK_LEFT 左键头键 VK_RIGHT 右箭头键VK_UP 上箭头键 VK_DOWN 下箭头键 VK_0~VK_9 0~9键 VK_A~VK_Z A~Z键第4章 键盘和鼠标4.1 键盘消息编程---键盘消息处理过程第4章 键盘和鼠标4.1 键盘消息编程---输入焦点能够接收键盘消息的窗口称为有“输入焦点”的窗口,这种窗口应是活动窗口及其子窗口。
输入焦点相关消息:WM_SETFOCUS:窗口正在接收输入焦点。
WM_KILLFOCUS:窗口失去输入焦点。
第4章 键盘和鼠标4.1 键盘消息编程---按键消息非系统按键消息:不使用Alt键组合的按键消息。
VisualC程序设计基础教程ch04精品PPT课件
AutCo#C程AD序计设算计机教辅程助设计
4.1 数组
清华大学出版社
4.1.3 多维数组的使用
int[] Aver={0,0,0}; //存储每门平均成绩的一维数组。
Console.WriteLine("学号 总分"); for (i=0;i<Pupil;i++) {
Sum=0; for (j=0;j<Class;j++) {
其中数组类型修饰符可以是任何在C#中定义的类型,数组类型修饰 符后面的方括号必不可少,数组名要符合变量命名规则,并且不和其他 成员名发生冲突。
在C#中,如果数组的大小必须动态地被计算,用于数组创建的语句 可以这样书写:
int ArrayLength= 5; int[] ArrayElement= new int[ArrayLength];
Console.WriteLine(i); }
AutCo#C程AD序计设算计机教辅程助设计
4.1 数组
清华大学出版社
4.1.3 多维数组的使用
多维数组的使用和一维数组类似,可以利用下标来访问,也可以 利用foreach循环进行遍历,请参考以下示例代码,该段代码用来计算 每位学生的总分和班级平均分。
AutCo#C程AD序计设算计机教辅程助设计
4.1 数组
清华大学出版社
4.1.1 数组的声明
C#中也允许在定义数组时对数组元素进行初始化,比如如下定义:
//定义string类型数组,数组元素分别由“C”,“C++”,“C#”进行初始化 string[] arrLanguages=new string[]{ "C", "C++", "C#" };
VC第四章
集合类
集合类是用来容纳和处理一组对象或标准数 集合类 据类型变量的C++结构,每个集合类对象可 以看做一个单独的对象,类成员函数可作用 于集合的所有元素.
根据对象在集合中的组织和存储方式,集合类 又可分为三种类型:链表,数组和映射(或字 典). (1)链表 链表类用于实现双向的,有序的,非索引的链表. (2)数组 它提供了可动态调整数组大小的,有序的,按整 数索引对象的数组 (3)映射 它以一种字典的方式组织数据,每个元素由一个 关键字和一个数值项组成.
3.文档模板 (1)CDocTemplate类图4.3 文档模板类在MFC类库 中的层次位置 (2)CDocTemplate类的主要成员函数如下. ① LoadTemplate( ):加载指定的模板. ② AddDocument( ):给文档模板添加指定的文档. ③ RemoveDocument( ):从文档模板列表中删除文档. ④ GetFirstDocPosition( ):获得与文档模板相关的第一 个文档的位置. ⑤ GetNextDoc( ):获得文档及下一个文档. ⑥ CreateNewDocument( ):建立文档.
单文档编程范例
1.为示例Editor创建工程框架 2.了解主要的类 3.向示例中添加自定义变量 4.向示例中添加初始化代码 4 6.向示例中添加文档串行化代码 7.在类CEditorView中添加变量 8.在类CEditorView中添加OnInitialUpdate成员函数 及其相关代码 9.在类CEditorView中的OnDraw()函数中添加代码 10.在类CEditorView中添加键盘消息函数及代码
CRecordView
CView类的主要数据成员和成员函数如下. ① OnDraw( ):保存所有显示代码. ② m_pDocument:保存指向相关文档的指针. ③ GetDocument( ):返回指向与视图相关的文 档的指针. ④ OnUpdate( ):当调用相关文档类的 UpdateAllViews( )函数时,该函数将被调用. (2)CEditView类 (3)CFditorDoc类 CEditorView类和CEditorDoc类是密切相关的, 文档是由文档模板对象生成的,并由应用程序 对象管理.用户通过与文档相联系的视图对象 来存储和管理应用程序的数据. 4.文档/视图结构中的消息传递 视图作为一个子窗口,当然可以处理消息.但 是应用程序运行时,除了视图外,还有应用程 序对象,主框架窗口,文档等,它们都是可以 处理消息的.
visual C++课件第4章
控件的创建与使用
在对话框中创建和使用控件的步骤如下:
用对话框编辑器将控件添加在对话框模板中; 利用类向导为对话框类增加与控件相关联的数据成 员; 利用类向导为对话框类增加与控件相关联的消息处 理函数; 在对话框类的OnInitDialog函数体中,为控件设置一 些初始条件; 在对话框类的控件消息处理函数中,添加控件处理 代码。
VC++案例教程 北大出版社
访问控件
一是用DDX(对话数据交换)技术 使用CWnd::UpdateData()函数可实现控件与其成员变量(值变量) 之间的数据的传输。其中: UpdateData(TRUE)——将控件中的数据传送给成员变量; UpdateData(FALSE)——将成员变量的数据传递给控件并显示。 例如,要在编辑框ID_NAME中显示“张”,则可以用下面两种方 法实现: 关联值变量,为编辑框ID_NAME关联CString变量m_Name,然后 执行下面的语句: m_Name=” 张”; UpdateData(false); 关联控件变量,为编辑框ID_NAME关联控件类CEdit变量 m_EditName,然后执行下面的语句: m_EditName.SetWindowText(“张”);
1. 对话框消息的发送 WM_INITDIALOG消息告诉你此时应初始化一个对话框。即所有 控件被创建并准备好。 WM_COMMAND消息是由控件发送的,用来通知对话框一些感兴 趣或有用的事件。当一个控件发送这个消息时,它在消息上签上 它的名字和一个通知码。 2. MFC对对话框的支持---CDialog 3. 公共对话框 CFileDialog CColorDialog CFontDialog CPrintDialog CFindReplaceDialog CPageSetupDialog
vc-4绘图-vc入门PPT课件
❖ CClientDC类代表了客户区设备环境。当在客户区实 时绘图时,需要利用CClientDC类定义一个客户区设 备环境。
❖ CPaintDC类用于响应WM_PAINT消息以支持重画。客户 区的重绘由函数OnPaint()完成。客户区重绘也可使 用Invalidate()函数来完成。
void Invalidate(BOOL bErase=TRUE)
2021/7/23
3
Windows绘图过程和设备无关性的实现:
应用程序首先向设备环境提出输出的请求,设
备环境接收绘图器请求(表现为GDI函数调用),并 将它们传给相应的设备驱动程序,完成特定硬件的
输出。
2021/7/23
4
❖ 为了支持GDI绘图,MFC提供了两个类:
设备环境类(上下文类):用于设置绘图属性和 绘制图形。
深红 128,0,0
0,255,0
深绿 0,128,0
0,0,255
深蓝 0,0,128
255,255,0
深黄 128,128,0
0,255,255
深青 0,128,128
255,0,255
灰色 192,192,192
255,255,255
黑色 0,0,0
14
选择一个GDI对象: 要使用创建的对象,首先应将它选入到设备上下
GDI简介
❖ Windows提供了一个抽象的图形界面接口,称为 图形设备接口(Graphics Device Interface) , 或简称GDI。
❖ 它负责管理用户绘图操作时功能的转换。用户 通过调用GDI函数与设备打交道,GDI通过不同 设备提供的驱动程序将绘图语句转换为对应的 绘图指令,避免了直接对硬件进行操作,从而 实现设备无关性。
vc04
程序:
#include <iostream> using namespace std; int print(int){return x;} int main() { int x; cout<<”请输入一个数字:\n”; 请输入一个数字: 请输入一个数字 cin>>x; cout<<”\n”; cout<<”输入的数字为:”<<print(x)<<endl;//print不 输入的数字为: 不 输入的数字为 是一个内联函数 return 0; }
类定义举例
class Student //定义学生类 定义学生类Student 定义学生类 { public: //声明类成员 声明类成员 void Getinfo(char* pname,char* pid,char Sex, int a,double s); void modify(float s); void display(); private: char* name; char* id; char sex; int age; double score; }; //类定义以分号结束 类定义以分号结束
将类声明和定义部分存放在头文件中
在头文件中对头文件进行定义, 在头文件中对头文件进行定义,在源文件中使用头文件定 义的类11.h如下 义的类 如下 #include <iostream> using namespace std; class A { public: inline void func(int x,int y) { i=x; j=y; } inline void print(){cout<<”两数相乘为:”<<i*j<<endl;} 两数相乘为: 两数相乘为 private: int i,j; };
C从入门到精通第4章教学PPT
4.2.3 浮点型
浮点数也称为实型数。共有两种表示形式:
小数表示法 实型常量分为整数部分和小数部分 如:2.12 指数表示法 也称科学记数法,指数部分以E或e开始,而且必须
是整数。 如:1.2e20,-3.4e-2
4.3 类型转化
所谓类型转化就是将一种数据类型转化为另外一种数据类 型。
自动转化:字符型---->短整型---->整型---->单精度浮 点型---->双精度浮点型
十六进制 0
1
2
3
4
5
6
7
二进制 1000 1001 1010 1011 1100 1101 1110 1111
十六进制 8
9
A
B
C
D
E
F
4.2 数据类型
➢ 4.2.1 整型 ➢ 4.2.2 字符型 ➢ 4.2.3 浮点型
4.2.1 整型
整型是计算机中最常用同时也是最简单的数据类型。 (1)整型的表示范围 (2)整型的输入和输出
reinterpret_cast 是特意用于底层的强制转型
4.3 类型转化
【范例4-3】 C++中的类型转化 功能:说明类型转化的意义和用法。
4.4 声明
4.4.1 声明的一般语法 4.4.2 类型名称 4.4.3 对象的生存周期 4.4.4 声明符 4.4.5 初始化
4.4.1 声明的一般语法
4.1.1 二进制
除2取余法 例如将十进制数29 转化为二进制的步骤如下: ➢ (1) 29÷2=14 //余数为1 ➢ (2) 14÷2= 7 //余数为0 ➢ (3) 7÷2= 3 //余数为1 ➢ (4) 3÷2= 1 //余数为1 ➢ (5) 1÷2= 0 //余数为1 ➢ 倒着将余数相连即为二进制——(11101)2
从零开始学vc系列教程完整版
从零开始学VC系列教程一.信息显示实验题外话:第一次写教程,不知道该怎么开始.以前见过的教程可能都会介绍比较多的理论然后才开始讲实际操作,我想对于VC,理论讲得太多大家可能更糊涂,所以选择了这个方案,我们先一步步照着做,每一次只介绍一两个知识点,并且把理论放在后面说明,希望大家能喜欢这种方式,并对这种方式提出意见和建议,以便以后章节更适合大家的学习.或许我写的还不能称之为教程,只是一些操作步骤及说明,通过这些练习,希望能使大家对VC有一个新的认识.VC的功能是十分强大的,但我们一般并不会用到所有的功能,就像大家熟悉的KeilC一样,其实Keil功能也是很多的,平时也没见谁把Keil的功能都用到了.基于此,我写的这个教程可能在VC专业人士看来比较简单.不是要班门弄斧,而是希望推行上位机技术,形成一个氛围让大家来学习交流,PC机与下位机结合毕竟也是发展的一个方向.望高手谅解小辈的不自量力.同时,我们结合单片机编程,让大家明白上位机控制方法及原理,当然这是今后章节的内容了.本节内容:学会在文本框中显示文本,学会弹出式对话框使用.学习目的:信息显示是人机交互的基础,同时,信息显示也为以后的程序调试打下基础.1.新建工程.打开VC6.0点击[文件]->[新建],弹出如下对话框.在工程选项中选择MFC AppWizard[exe],选择好工程存入的位置,然后在工程名称中填入工程的名称,例如Eg01,填入Eg01后.VC会在我们选择的路径后自动加入一个以工程名命名的文件夹作为工程目录.完成按[确定]就会进入工程向导,出现以下的提示.在这个我们选择[基于对话框]就行了.单文档及多文档方式会在以后详细介绍.这里也简要说明一下.①单文档.程序一次只能处理一个文档对象(文件).像写字板,记事本等.②多文档.程序一次可以处理多个对象(文件),像word之类的,可以同时打开多个文件.③基本对话框.程序一般用于处理一些比较小的,工具型的软件.像双龙的ISP下载软件,Easy 51Pro等都是基于对话框.一些不是很复杂的工业软件也通常可以用基于对话框的形式,这种方式的优点是所见即所得,一些控件可以像VB一样拖到工作区就行了.选好以后直接按[完成]就可以了.至于[下一步]的向导,这里我们先不管.然后会进入以下的画面.其中红色及绿色是我的标注,看不清图片可以下载图片放大.[属性Properties]菜单项,弹出如下对话框修改IDC_STATIC为IDC_FIRSTLABEL,标题可以写为”第一个应用程序”然后关闭这个对话框,就可以看到刚才的静态文本框内容变为”第一个应用程序”了.在刚才的操作中,我们将静态文本框的ID改为了IDC_FIRSTLABEL,在VC中,ID是控件的标志,不能有相同的ID出现,但允许多个名为IDC_STA TIC的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 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 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_PROGRESS static 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对象等等。
VC开发技术-chp4
计算机工程学院:余琨 QQ:784116410 Mail:yukunff8@
LOGO
第四章 菜单、工具栏和状态栏
菜单 工具栏 状态栏
菜单
一、菜单 1.菜单一般规则 若单击某菜单项后,将弹出一个对话框,那么在该菜单 项文本后有“…”。 若某项菜单有子菜单,那么在该菜单项文本后有“” 。 若菜单项需要助记符,则用括号将带下划线的字母括起 来。助记符与Alt构成一个组合键,当按住“Alt”键不 放,再敲击该字母时,对应的菜单项就会被选中。 若某项菜单需要快捷键的支持,则一般将其列在相应菜 单项文本之后。
菜单
6.菜单的动态编程控制
创建菜单 插入菜单项 添加菜单项 删除菜单项 获取菜单项 装入菜单资源
菜单
菜单
菜单
Hale Waihona Puke 菜单菜单菜单菜单
菜单
菜单
菜单
菜单
菜单
菜单
菜单
菜单
菜单
菜单
菜单
菜单
2.示例:应用程序菜单的切换和 加速键的设置(书例) chp4_1 演示:菜单的基本操作 加速键的设置
菜单
3.菜单的访问
→获取菜单栏指针
→获取要访问的子菜单指针
→按位置索引/按命令ID访问对应菜单项 →进行所要做的处理
查看MSDN,学习CMenu类
菜单
示例:chp4_2 标记菜单 缺省菜单 位图标记菜单(注意位图的加载和大 小) 屏蔽菜单项功能(注意产生的问题, 命令更新机制) 菜单的取消和加载
菜单
5.右键弹出菜单
方法一:使用MFC为我们所定制的
菜单
菜单
菜单
菜单
注意: ⑴运行查看效果,是否有右键弹出菜单; ⑵查看MFC为我们所添加的代码 ⑶查看对应的资源 ⑷通过MSDN学习 OnContextMenu() TrackPopupMenu ()
精品课件-Visual C++程序设计及实践-第4章 C++面向对象
// sAtcactoiucntf.lcopapt文件GetInterestRate()
flo{at CAccount::m_nInterestRate=0.022;
return m_fInterestRate;
}
private:
char率,静态成员,多个所有账户实例都要共享同一
➢ 继承允许创建分等级层次的类。
➢ 运用继承,能够创建一个通用类,通过继承增加、修改或替 换给定类中的方法对这个类进行扩充,以适应不同的要求。 //定义派生类的一般格式如下: class class_name: access parent_name { ......//省略 };
13
类继承—派生类对象的构造
//创建堆对象的方法如下: //类定义没有提供构造函数,或者要调用缺省构造函数 class_name* pobj= new class_name; //调用类的带参数的构造函数 class_name* pobj= new class_name(argu_list);
-7
类与对象—析构函数
➢析构函数也是类中的特殊成员函数,要在前面加上一个波浪号 “~”。 ➢一个类中只能有一个析构函数。 ➢析/c构/l类a函s的s数定c执l义a行s文s与_件n构a中m造e,函析数构相函反数的声操明作的,格通式常如用下于:释放分配给对 象的{存储空间。
<return_type> methodName([<argu_list>]); }; //.cpp <return_type> class_name::methodName([<argu_list>]) {
...... // 具体实现 }
-9
类与对象—内联成员函数
VisualC教程第4版PPT1第4章菜单工具栏和状态栏
理程序向导”对话框,在“类列表”中选定CMainFrame类,其他默认,单击
按钮,向导对话框退出。
这样,就为CMainFrame类添加了菜单项ID_VIEW_TEST的COMMAND“事件”的默认处理函数OnViewTest,
并添加下列代码:
void CMainFrame::OnViewTest()
菜单空位置 菜单资源默认ID
④ 打开IDR_MAINFRAME菜单资源,添加顶层菜单项“测试(&T)”并移至菜单项“视图(&V)”和“帮助(&H)” 之间,在其下添加一个菜单项“显示测试菜单(&M)”,指定ID属性为ID_VIEW_TEST。
更改应用程序菜单
3. 完善代码
① 将项目工作区窗口切换到“类视图”页面,展开类结点,右击CMainFrame类名,从弹出的快捷菜单
01 菜单一般规则
目 录
菜单一般规则
为了使应用程序更容易操作,对于菜单系统的设计还遵循下列一些规则(参考图4.1):
顶层菜单
下拉菜单
菜单一般规则
① 若单击某菜单项后,将弹出一个对话框,那么在该菜单项文本后有“…”。 ② 若某项菜单有子菜单,那么在该菜单项文本后有“”。 ③ 若菜单项需要助记符,则用括号将带下划线的字母括起来。助记符与【Alt】键构成一个组合键,当按 住【Alt】键不放,再敲击该字母时,对应的菜单项就会被选中。 ④ 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键, 如【Ctrl+N】,使用时先按下【Ctrl】健不放,然后再按【N】键。任何时候按下快捷键,相应的菜单命令都 会被执行。
nPosition值 菜单项资源ID 菜单项的位置
nIDNewItem值 lpszNewItem值
vc++第4章
} }
如何有效地完成重复工作
求自然数1~10之和 分析:本题需要用累加算法,累加过程是一个循
环过程,可以用while语句实现。
循环语句
循环结构一般由两部分组成: • 进入或退出循环的条件:该条件决定是
表达式
F
语句
T
#include<iostream.h> void main() {
int i=1, sum=0; while(i<=10) {
sum+=i; //相当于sum=sum+i; i++; } cout<<"sum="<<sum <<endl; }
do-while 语句
• 一般形式
do 语句 while (表达式)
P2 F
P3 F
S4
T
T
S1
T S2
S3
if条件语句的说明
if后面的<表达式>通常为逻辑表达式或关系 表达式。表达式的值用来表示“条件”,必 须放在括号中。
if和else后的<语句>部分必须为一个语句, 可以是复合语句,也可以是单个语句,还可 以是空语句,但不能为空。
如果有多个语句,则必须用大括号{ }括起来 ,构成复合语句;对于单个语句,则可以不 用大括号。
以case中的常量表达式值为入口标号,由此开始顺序执行。 因此,每个case分支最后应该加break语句。
#include <iostream.h> void main() { int day;
C语言第4章vc
运行结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
说明:
同一个问题,可能有多种算法
2 next 第3项
+ 2b 2a 3 next 第4项
规律:
next=a+b; a=b; b=next;
a 1
+
b 3
3a +
5 next 第5项
5 b 8 next 第6项
… …
main( ) { int i=0,n=0; long a=0,b=0,next=0; a=b=1; 处理前两项 printf("%10ld%10ld",a,b); n=2; 处理后28项 for ( i=3; i<=30; i++ ) { next=a+b; printf("%10ld",next); n++; if ( n%6==0 ) printf("\n"); a=b; b=next; } } 输出并控制换行
符号翻转
完 整 程 序
#include <stdio.h>
main( )
{ int i=0,sign=1;
float sum=0.0;
for ( i=1; i<=100; i++ ) { sum=sum+(float) sign/ i; sign=-sign; 运行结果 } sum=0.688172 printf("sum=%f\n",sum); }
VC4
⑦void f7(float c[][N], int m, float& max){…}
⑧bool f8(ElemType *& bt, ElemType& item){…} ⑨int max(int x,int y){returnx>y?x:y;} //有参函数 ⑩function(){ } //空函数
使用引用应注意的问题
• 声明一个引用时,必须同时对它们进行初始化, 使它指向一个已存在的对象; • 引用不是变量,不占内存; • 不能建立引用数组; • 引用不能用类型初始化 • 引用有三种形式: int &ti=i; int & ri =i; int& ri=i;
例4.3—p82
#include<iostream.h> void swap(int &a,int &b); int main() { int x(5),y(10); cout<<"x=<<x<<" y="<<y<<endl; swap(x,y); cout<<"x=<<x<<" y="<<y<<endl; return 0; } void swap(int &a,int &b) {int t; t=a;a=b;b=t; cout<<"a=<<a<<" b="<<b<<endl; } 程序执行结果:
运行结果: The values are 7 2 The values are 107 102 The values are 7 102
VC++04
类的应用举例(例4-1)
类 和 对 象
//主函数 void main(void) { Watch myWatch; //定义对象 myWatch.SetTime(); //按默认值设置 myWatch.ShowTime(); myWatch.SetTime(8,30,30); myWatch.ShowTime(); }
35
构造函数
构 造 函 数 和 析 构 函 数
构造函数的名字一定和类的名字相同。 构造函数没有返回值;函数也没有类 型。
构造函数主要是两个功能:为对象开辟空间, 为对象中的数据成员赋初值。
如果没有定义构造函数,编译系统会自动生 成一个确省的构造函数。
36
构造函数
构 造 对上例中构造函数的默认构造函数是: 函 watch::watch() 数 { 和 } 析 只能用来设置对象的存储空间,不能赋初值。 构 函 数
23
内联成员函数举例(二)
类 和 对 象
class Location { public: void Init(int initX,int initY); int GetX(); int GetY(); private: int X,Y; };
24
inline void Location:: Init(int initX,int initY) { X=initX; Y=initY; } inline int Location::GetX() { return X; }
3
面向对象的方法
面 向 对 象 的 思 想
观点:自然界是由实体(对象)所组 成。 程序设计方法:使用面向对象的观点 来描述模仿并处理现实问题。 要求:高度概括、分类和抽象。 目的:实现软件设计的产业化。
VC教案4-C++对象
课题: C++基础目的要求:掌握类的构造函数,析构函数与内联函数的定义与使用掌握类对象的重载与派生的概念与操作教学重点:类对象的基本操作教学难点:类对象的基本操作教学课时: 4教学方法:教学内容与步骤:对象数组C++中,可以创建对象数组。
为了创建对象数组,构造函数的形式必须是:(1)使用默认构造函数;(2)若有用户自定义构造函数,则必须含有一个不带参数或具有一个带默认参数的构造函数。
构造函数和析构函数构造函数和析构函数都是类的成员函数,但它们是特殊的成员函数,不用调用便自动执行,而且这些函数的名字与类的名字有关。
构造函数构造函数是一种用于创建对象特殊的成员函数,当创建对象时,系统自动调用构造函数,不能在程序中直接调用。
构造函数名与类名相同,一个类可以拥有多个构造函数(重载),构造函数可以有任意类型的参数,但不能具有返回类型。
构造函数的作用是:建立对象的基本结构,进行数据成员赋值初始化。
即:初始化虚函数表;建立基类对象;建立非静态数据成员对象;安置虚基类对象信息;执行构造函数体中的代码。
如果一个类没有定义构造函数,编译器会自动生成一个不带参数的默认构造函数,其格式如下:<类名>::<默认构造函数名>(){}在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来初始化该对象。
定义了构造函数时,严格按定义格式(有参数的形式和无参数的形式等)调用。
构造函数对对象成员初始化带参数的构造函数:带参数的构造函数可以在创建对象时,用具体数值初始化数据成员和各种数据元素。
注意:构造函数的参数个数和类型规定了声明一个对象时,为对这个对象进行初始化所需要的初始值的个数和类型。
例如:Location A (100,200) ; // OKLocation B (10) ; // errorLocation A ; // error若有多个重载构造函数,系统自动寻找匹配。
构造函数可以像普通函数一样被重载,C++根据说明中的参数个数和类型选择合适的构造函数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第4章MFC应用程序框架剖析在进行一个Windows应用程序开发之前,首先需要选择一个开发环境。
假定我们现在只给出两种选择:一种是使用Win32应用程序编程接口的C语言程序;另一种是使用MFC 应用程序框架的C++语言程序。
在这里,笔者并不想阐述这两种选择哪个更好,而是想通过这两种开发环境的比较让读者更好的理解本章将要讲述的重点——MFC。
4.1 什么是MFC以及MFC的特点只要使用过传统的windows编程方法开发应用程序的读者都深刻地体会到,即使是开发一个简单的windows应用程序也需要对windows的内部编程原理有很深刻的认识,同时也要手工编写很多的代码。
用C直接编写Windows API应用程序,代码量是非常大的,因为你所要照顾的细节太多了,更令人头疼的是,随着代码行数的增多,程序的可读性、可维护性也大大的降低,因此,传统的windows编程是需要极大的耐心和丰富的编程经验的。
近几年来,面向对象技术无论是在理论还是实践上都在飞速地发展。
面向对象技术中最重要的就是“对象”的概念,它把现实世界中的人、机器等客观实体抽象成程序中的“对象”。
这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。
如人的体重,机器的体积等,而方法是指对象本身所能执行的功能,如人能行走,机器能运作等。
一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要知道如何调用对象所提供的方法来完成特定的功能。
从这里我们可以看出,当把面向对象技术应用到程序设计中时,程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。
MFC的英文全称是Microsoft Fundation Classes,即微软的基本类库,它位于任何Windows API 之上,在这个类库中包含了一百多个程序开发过程中最常用到的对象。
它减少了大量在建立Windows 程序时必须编写的代码。
同时它还提供了所有一般C++ 编程的优点,例如继承和封装。
正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们在编程时极少需要关心对象方法的实现细节,而只需要简单地调用已有对象的方法就可以了。
即使类库中的那些对象的方法不能满足我们的需要时,我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,产生一个更专门的,功能更为强大的对象。
这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。
MFC不仅给用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件。
下面,我们将会通过一个实例来验证MFC的特点。
还记得我们在第二章中讲过的那个创建窗口的程序(EX02-00)吗?创建一个窗口然后在该窗口的顶端打印一条语句并响应鼠标键盘消息,读者大概不会忘了,为了实现这个功能所要做的那些烦琐的步骤,包括创建一个窗口类、注册类、创建窗口、刷新窗口、消息循环等等。
下面,我们将利用MFC类库功能模仿AppWizard建立一个这样的程序,看看它是怎么实现的。
请看清单4-00中的代码。
如果你是第一次看到这类程序,也许比较难理解,这没关系,我们后面会详细介绍。
现在你只要用Visual C++ 环境中建立、编译和运行它就可以了。
建立一个Win32程序(实际上本节的这个程序并非一个真正W32程序,只是采用W32编程环境,利用MFC类库来实现)的过程忘了吗?步骤同第二章所讲述的一样,只不过代码不同。
启动Visual C++,打开New Wizard对话框,选择Project选项卡,在左边的窗口中选择Win32 Application,在右边输入工程名,OK就可以了,然后从Project菜单中选择Add to Project | New,再次打开New Wizard对话框,在左边窗口选择C++ Source file,在右边输入和工程名相同的文件名就可以了,最后在代码编辑区中输入下面清单中的语句就可以编译运行了。
完整的例程请参见光盘中的例子代码EX04-00。
清单4-00 模仿MFC应用程序框架生成一个窗口//*****************************************************// MyApp.h//*****************************************************#include "afxwin.h"class CMyApp:public CWinApp{public:virtual BOOL InitInstance();};class CMyFrame:public CFrameWnd{public:CMyFrame();protected:afx_msg void OnPaint();DECLARE_MESSAGE_MAP()};//*****************************************************// MyApp.cpp//*****************************************************CMyApp theApp; //建立一个CMyAPP对象BOOL CMyApp::InitInstance (){m_pMainWnd=new CMyFrame();m_pMainWnd->ShowWindow (m_nCmdShow);m_pMainWnd->UpdateWindow ();return TRUE;}BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)ON_WM_PAINT()END_MESSAGE_MAP()CMyFrame::CMyFrame(){Create(NULL,"MYAPP Application");}void CMyFrame::OnPaint (){CPaintDC dc(this);dc.TextOut (0,0,"Hello World!");}编译上面的程序,报错!!为什么呢?原来还没有添加MFC的支持,从Project菜单选定Setting对话框,选择General属性页,在Microsoft Foundation Classes标题下选择Use MFC in a Static Library一项就可以了。
上面的程序只是模仿MFC应用程序框架生成的一个程序,实际上,若是真正用MFC 应用程序框架来生成该程序,用户只需要键入清单中黑体的那一条语句,而其他那些语句,在用AppWizard应用程序向导生成框架时AppWizard已经自动为我们添加了。
我们所要做的工作,只是找到OnDraw()或OnPaint()成员函数,键入pDC->TextOut(0,0,"Hello World!");或dc.TextOut (0,0,"Hello World!");一条代码就可以了。
看出来了吧,使用MFC 进行Windows 编程时是一件多么容易的过程。
综上所述,MFC的优点可归结为以下几点:●MFC是C++的Microsoft Windows 应用程序编程接口。
●MFC开发的应用程序使用了标准化的结构。
●使用MFC开发的应用程序不仅小,而且运行快。
●Visual C++工具降低了编码的复杂性。
●MFC库功能丰富(具体功能请参见相关书籍)。
4.2 什么是MFC应用程序框架什么是应用程序框架(Application Frame)?大概有的读者还不了解。
说白了,就是一个集合,而这个集合可以提供一般应用程序所需的全部面向对象软件组件。
一个应用程序框架是一个类库的超级集合。
一般的库是设计集成到任何程序类的集合,但是一个应用程序框架不同于单纯的类的集合,它自己定义了程序的结构。
上面空洞的语句大概并不能使我们很好的了解到底什么是应用程序框架,那么,我们将通过使用AppWizard应用程序向导生成的一个最简单的程序来使大家理解到底什么是应用程序框架。
1. 首先启动Visual C++,在“File”菜单中选择“New”选项, 打开New Wizard,如图4-00所示,在该窗体中选择Projects标签,然后在左侧窗口选择MFC AppWizard(exe),在右侧的Project Name(项目名)文本框中,为新建的项目输入一个名称,如Test。
2. 单击OK按钮弹出MFC AppWizard—Step1对话框,如图4-01所示。
该对话框中要求用户选择生成哪种类型的应用程序:单文档(Single document)、多文档(Multiple documens)还是基于对话框(Dialog based)的应用程序。
我们选择Single document,其他的按默认设置。
需要用户了解的是如果我们选择Single document,那么应用程序会给我们生成一个单文档-视图应用程序框架;如果我们选择的是Multiple documens,那么应用程序会给我们生成一个多文档-视图应用程序框架图4-00 New Wizard图4-01 MFC AppWizard—Step1对话框3. 单击NEXT按钮弹出MFC AppWizard—Step2of6对话框,如图4-02所示。
询问用户应用程序是否支持数据库:不支持数据库(None)、仅支持头文件(Header files only)、没有支持文件的数据库视图(Database view without file support)、带文件支持的数据库视图(Database view with file support)。
我们选择None。
图4-02 MFC AppWizard—Step2of6对话框4. 单击NEXT按钮弹出MFC AppWizard—Step3of6对话框,如图4-03所示。
询问用户应用程序支持何种复合文档:不支持复合文档(None)、容器(Container)、能够创建管理复合文档但Mini-server应用程序不能单独运行(Mini-server)、能够创建管理复合文档并且能单独运行(Full-server)、用户应用程序既是容器又是服务器(Both container and server)。
我们选择None,其他设置按默认。