windows程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
消息驱动运行中发生的各种事件(鼠标键盘输入,各种状态的改变等),以消息的形式通知Windows系统Windows系统接收消息,提交给发生事件的应用程序应用程序的窗口处理函数负责处理响应收到的消息处理完成后继续等待下一个消息API application programming Interface SDK software Development kit 事件是用户对计算机操作的动作或程序中某个对象的状态发生的变化,每个事件对应一个消息,即每个事件发生的效果是产生消息消息是描述事件发生的信息事件驱动程序执行的顺序不是事先规定的,而是由事件的发生来控制在程序执行过程中,当某个对象的状态发生变化,或有外部输入等情况发生,则产生相应的事件当事件产生时,系统会发出特定的消息编写程序时可以对这些消息做出反应,也可以不做出;若要做出反应(即响应消息),则把响应此消息的程序写在与此消息相关联的函数中在程序执行时,一旦产生了一个消息,会调用与此消息相关联的函数窗口是Windows应用程序基本的操作单位,是应用程序与用户之间交互的接口,也是系统管理应用程序的基本单位消息传输事件发生,产生消息消息保存到消息队列分配给应用程序消息队列消息循环提取消息窗口函数响应消息MFC Microsoft foundation class MFC应用程序框架提供了一般应用程序需要的全部面向对象软件组件的集成集合MFC程序结构基于框架窗口的应用程序(早期的MFC)程序运行管理、窗口及数据管理分开两部分,与SDK程序类似基于文档/视图的应用程序单文档应用程序(重点)程序运行管理、窗口管理、交互管理、数据管理分开基于对话框的应用程序程序运行管理、对话框管理分开目前的MFC应用程序都采用文档/视图结构,把原来窗口框架类的工作分开窗口框架类管理窗框视图类(即视窗类)管理数据显示、接收用户输入文档类负责数据管理文档视图架构的思想数据嵌入文档中,利用文档的架构管理文档与视图通信,使数据在视图中显示视图显示数据,并与用户交互视图放入窗口中文档模板类对象管理上述对象协调工作CDocument是负责管理数据的类应用程序中的文档类是这个类的派生类作用数据管理程序员应将用户的实际数据对象内嵌在自己的文档类中需要与自己的视图类通信在程序中实现CDocument的派生类,以便嵌入数据对象,并改写成员函数实现对数据的处理用于派生应用程序的视图类CView 作用处理与用户的交互显示文档类中的数据接收用户输入(例如鼠标操作)通常要改写视图类的成员函数OnDraw或OnPrint,实现数据显示框架自动调用OnDraw函数WM_PAINT消息OnPaint()OnDraw() 菜单及响应利用菜单编辑器修改IDR_MAINFRAME 菜单资源在相应的类中为新菜单项映射消息COMMAND单击或用快捷键选中时生产UPDATE_COMMAND_UI上一级菜单显示前生产用于控制菜单状态编写新菜单项的消息处理函数快捷键在菜单项标题后面加“(&字母)”菜单动态为要添加的菜单项定义一个宏(例如ID_MENU1)用CWnd::GetMenu( )获得指向菜单条的指针(如果在子菜单上添加,应用CMenu::GetSubMenu()获得该菜单的指针)为菜单项手工映射消息处理函数在适当的地方调用InsertMenu或AppendMenu添加菜单项调用CWnd::DrawMenuBar()函数重画菜单动态删除菜单项与上面类似(使用DeleteMenu函数)动态创建菜单项用函数BOOL CreateMenu( );获得新菜单句柄,再用此句柄当作AppendMenu函数的第2个参数(需进行(UTIN)强制类型转换)通常用于创建弹出式菜单的顶级(不需映射消息)快捷菜单建立菜单如果菜单已经存在,且功能齐全,只需确定弹出方式即可也可以另加一个菜单资源,此法可使菜单条中不显示快捷菜单关联类(对于新加菜单)把此菜单资源关联到视图类上选中此菜单资源的情况下打开类向导,选视图类影射消息并编写消息处理函数选择弹出方式可在视图类的WM_CONTEXTMENU消息(鼠标右键单击客户区时产生)处理函数中弹出Windows系统有一个存放消息的队列每个应用程序也有一个消息队列Windows系统先将收到的消息存放在系统队列中,然后再分发到相应的应用程序队列中应用程序则从自身的队列中获取消息并进行处理类的消息响应一个类要响应多种消息对于每一种消息最重要的是知道是哪个消息:消息的标识(ID 身份证)这个消息对应的响应函数是什么(函数的起始地址)解决的办法建立一个结构体数组(消息映射表)一行(一个数组元素)是一个消息的信息每行至少包含消息的标识(ID)指向响应函数的指针消息的响应当收到消息后,根据消息ID在表中查找,找到后调用对应的消息处理函数消息路由当一个类收到消息后,先在自己的消息映射表中搜索,搜索到就执行相应的消息处理函数,然后结束消息处理过程未搜到,则到上一层基类中搜索,依此类推如果都未搜到,则交给系统默认的窗口处理函数去处理消息种类窗口消息命令消息控件通知消息实现消息映射消息映射的要点为每个要响应的消息建立一个处理函数为每个能够响应消息的类建立一个结构类型的数组(消息映射表)并填写这个数组编写每个消息处
理函数的代码声明消息处理函数
afx_msg void 函数名( ); //有些有返回值或参数(特别是窗口消息)
对于窗口消息格式:ON_消息ID( )
对于命令消息格式:ON_COMMAND(产生消息对象的ID,函数名)
对于控件通知消息格式:ON_通知码(控件ID,函数名)
在类的实现文件中为每个消息处理函数编写代码
用户自定义消息何时用
当程序运行到某个节点,需要发出一个消息
要做的事:需要有一个消息标示(ID)需要一个消息处理函数
把消息ID和消息处理函数填写到类的消息映射表中为消息处理函数编写代码
在需要发出消息的程序代码处发出该消息不能使用类向导
用户自定义消息方法
定义一个消息ID(宏)声明消息处理函数
在类的声明文件中(.h文件)afx_msg void OnMyMessage( ); 说明:根据需要决定是否有返回值、参数填写消息映射表编写消息响应函数
在类的程序文件中(.cpp文件)
void CMyMsgView::OnMyMessage( ) {……}
在需要发出消息的地方用CWnd ::SendMessage发出消息
Message ——消息ID
也可用CWnd ::PostMessage函数(参数相同,返回值类型:BOOL)
区别将消息放置在消息队列的末尾,不等待窗口处理该消息就直接返回
SendMessage():发送消息,且一直等待窗口处理完该消息之后才返回
对话框
对话框是一种资源,使用时要用一个CDialog类的派生类与它相关联
CDialog类是CWnd类的派生类,所以对话框是一个窗口
CDialog类封装了对话框常用操作的功能函数对话框是窗口的集合,上面放置各种控件
控件所对应的类是CWnd类的派生类控件是对话框窗口的子窗口
种类
模式对话框对话框弹出后,只能进行对话框操作,不能进行其他窗口的操作,直到本对话框被关闭无模式对话框对话框弹出后,可以进行其他窗口的操作(可以与其他窗口切换操作)
模式对话框创建
用对话框编辑器设计对话框(包括上面的控件)
为对话框关联一个类(利用类向导)
在相应打开对话框的类里面声明一个对话框类对象
调用对话框对象的DoModal()成员函数来创建对话框,关闭对话框后对话框对象自动销毁CMyDlg dlg; dlg.DoModal( );
可以根据DoModal()函数的返回值判断对话框关闭方式
IDOK 表示按“确定”按钮(ID是IDOK)关闭IDCANCEL表示按“取消”按钮(ID是IDCANCEL )关闭CPasswordDlg dlg; if(dlg.DoModal( )==IDOK){ if(dlg.m_Password == "123456")......Else }
非模式对话框创建、
用Create函数创建
调用ShowWindow函数显示对话框
CMyDlg *pDlg; //声明对话框类指pDlg=new CMyDlg ; //动态创建对象
pDlg->Create(对话框ID, this); //创建对话pDlg->ShowWindow(SW_SHOW); //显示对话框