windows程序设计.docx





《windows程序设计.docx》由会员分享,可在线阅读,更多相关《windows程序设计.docx(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、windows程序设计 消息驱动运行中发生的各种事件(鼠标键盘输入,各种状态的改变等),以消息的形式通知Windows系统Windows系统接收消息,提交给发生事件的应用程序应用程序的窗口处理函数负责处理响应收到的消息处理完成后继续等待下一个消息API application programming Interface SDK software Development kit 事件是用户对计算机操作的动作或程序中某个对象的状态发生的变化,每个事件对应一个消息,即每个事件发生的效果是产生消息消息是描述事件发生的信息事件驱动程序执行的顺序不是事先规定的,而是由事件的发生来控制在程序执行过程中,当某
2、个对象的状态发生变化,或有外部输入等情况发生,则产生相应的事件当事件产生时,系统会发出特定的消息编写程序时可以对这些消息做出反应,也可以不做出;若要做出反应(即响应消息),则把响应此消息的程序写在与此消息相关联的函数中在程序执行时,一旦产生了一个消息,会调用与此消息相关联的函数窗口是Windows应用程序基本的操作单位,是应用程序与用户之间交互的接口,也是系统管理应用程序的基本单位消息传输事件发生,产生消息消息保存到消息队列分配给应用程序消息队列消息循环提取消息窗口函数响应消息MFC Microsoft foundation class MFC应用程序框架提供了一般应用程序需要的全部面向对象软
3、件组件的集成集合MFC程序结构基于框架窗口的应用程序(早期的MFC)程序运行管理、窗口及数据管理分开两部分,与SDK程序类似基于文档/视图的应用程序单文档应用程序(重点)程序运行管理、窗口管理、交互管理、数据管理分开基于对话框的应用程序程序运行管理、对话框管理分开目前的MFC应用程序都采用文档/视图结构,把原来窗口框架类的工作分开窗口框架类管理窗框视图类(即视窗类)管理数据显示、接收用户输入文档类负责数据管理文档视图架构的思想数据嵌入文档中,利用文档的架构管理文档与视图通信,使数据在视图中显示视图显示数据,并与用户交互视图放入窗口中文档模板类对象管理上述对象协调工作CDocument是负责管理
4、数据的类应用程序中的文档类是这个类的派生类作用数据管理程序员应将用户的实际数据对象内嵌在自己的文档类中需要与自己的视图类通信在程序中实现CDocument的派生类,以便嵌入数据对象,并改写成员函数实现对数据的处理用于派生应用程序的视图类CView 作用处理与用户的交互显示文档类中的数据接收用户输入(例如鼠标操作)通常要改写视图类的成员函数OnDraw或OnPrint,实现数据显示框架自动调用OnDraw函数WM_PAINT消息OnPaint()OnDraw() 菜单及响应利用菜单编辑器修改IDR_MAINFRAME 菜单资源在相应的类中为新菜单项映射消息COMMAND单击或用快捷键选中时生产U
5、PDATE_COMMAND_UI上一级菜单显示前生产用于控制菜单状态编写新菜单项的消息处理函数快捷键在菜单项标题后面加“(&字母)”菜单动态为要添加的菜单项定义一个宏(例如ID_MENU1)用CWnd:GetMenu( )获得指向菜单条的指针(如果在子菜单上添加,应用CMenu:GetSubMenu()获得该菜单的指针)为菜单项手工映射消息处理函数在适当的地方调用InsertMenu或AppendMenu添加菜单项调用CWnd:DrawMenuBar()函数重画菜单动态删除菜单项与上面类似(使用DeleteMenu函数)动态创建菜单项用函数BOOL CreateMenu( );获得新菜单句柄,
6、再用此句柄当作AppendMenu函数的第2个参数(需进行(UTIN)强制类型转换)通常用于创建弹出式菜单的顶级(不需映射消息)快捷菜单建立菜单如果菜单已经存在,且功能齐全,只需确定弹出方式即可也可以另加一个菜单资源,此法可使菜单条中不显示快捷菜单关联类(对于新加菜单)把此菜单资源关联到视图类上选中此菜单资源的情况下打开类向导,选视图类影射消息并编写消息处理函数选择弹出方式可在视图类的WM_CONTEXTMENU消息(鼠标右键单击客户区时产生)处理函数中弹出Windows系统有一个存放消息的队列每个应用程序也有一个消息队列Windows系统先将收到的消息存放在系统队列中,然后再分发到相应的应用
7、程序队列中应用程序则从自身的队列中获取消息并进行处理类的消息响应一个类要响应多种消息对于每一种消息最重要的是知道是哪个消息:消息的标识(ID 身份证)这个消息对应的响应函数是什么(函数的起始地址)解决的办法建立一个结构体数组(消息映射表)一行(一个数组元素)是一个消息的信息每行至少包含消息的标识(ID)指向响应函数的指针消息的响应当收到消息后,根据消息ID在表中查找,找到后调用对应的消息处理函数消息路由当一个类收到消息后,先在自己的消息映射表中搜索,搜索到就执行相应的消息处理函数,然后结束消息处理过程未搜到,则到上一层基类中搜索,依此类推如果都未搜到,则交给系统默认的窗口处理函数去处理消息种类
8、窗口消息命令消息控件通知消息实现消息映射消息映射的要点为每个要响应的消息建立一个处理函数为每个能够响应消息的类建立一个结构类型的数组(消息映射表)并填写这个数组编写每个消息处 理函数的代码声明消息处理函数 afx_msg void 函数名( ); /有些有返回值或参数(特别是窗口消息) 对于窗口消息格式:ON_消息ID( ) 对于命令消息格式:ON_COMMAND(产生消息对象的ID,函数名) 对于控件通知消息格式:ON_通知码(控件ID,函数名) 在类的实现文件中为每个消息处理函数编写代码 用户自定义消息何时用 当程序运行到某个节点,需要发出一个消息 要做的事:需要有一个消息标示(ID)需要
9、一个消息处理函数 把消息ID和消息处理函数填写到类的消息映射表中为消息处理函数编写代码 在需要发出消息的程序代码处发出该消息不能使用类向导 用户自定义消息方法 定义一个消息ID(宏)声明消息处理函数 在类的声明文件中(.h文件)afx_msg void OnMyMessage( ); 说明:根据需要决定是否有返回值、参数填写消息映射表编写消息响应函数 在类的程序文件中(.cpp文件) void CMyMsgView:OnMyMessage( ) 在需要发出消息的地方用CWnd :SendMessage发出消息 Message 消息ID 也可用CWnd :PostMessage函数(参数相同,返
10、回值类型:BOOL) 区别将消息放置在消息队列的末尾,不等待窗口处理该消息就直接返回 SendMessage():发送消息,且一直等待窗口处理完该消息之后才返回 对话框 对话框是一种资源,使用时要用一个CDialog类的派生类与它相关联 CDialog类是CWnd类的派生类,所以对话框是一个窗口 CDialog类封装了对话框常用操作的功能函数对话框是窗口的集合,上面放置各种控件 控件所对应的类是CWnd类的派生类控件是对话框窗口的子窗口 种类 模式对话框对话框弹出后,只能进行对话框操作,不能进行其他窗口的操作,直到本对话框被关闭无模式对话框对话框弹出后,可以进行其他窗口的操作(可以与其他窗口切
11、换操作) 模式对话框创建 用对话框编辑器设计对话框(包括上面的控件) 为对话框关联一个类(利用类向导) 在相应打开对话框的类里面声明一个对话框类对象 调用对话框对象的DoModal()成员函数来创建对话框,关闭对话框后对话框对象自动销毁CMyDlg dlg; dlg.DoModal( ); 可以根据DoModal()函数的返回值判断对话框关闭方式 IDOK 表示按“确定”按钮(ID是IDOK)关闭IDCANCEL表示按“取消”按钮(ID是IDCANCEL )关闭CPasswordDlg dlg; if(dlg.DoModal( )=IDOK) if(dlg.m_Password = 12345
12、6).Else 非模式对话框创建、 用Create函数创建 调用ShowWindow函数显示对话框 CMyDlg *pDlg; /声明对话框类指pDlg=new CMyDlg ; /动态创建对象 pDlg-Create(对话框ID, this); /创建对话pDlg-ShowWindow(SW_SHOW); /显示对话框 /其他操作 delete pDlg; /释放内存空间(对话框销毁) 创建基于对话框的应用程序: 用AppWizard创建应用程序用对话框编辑器设计界面(添加控件)用ClassWizard使控件与对象的关联用ClassWizard进行消息映射 控件控件是对话框上或窗口上的子窗口
13、每一类控件有自己的类,控件是该类对象 所有控件都是窗口,所有控件类都由CWnd类派生使用对话框编辑器可以很方便地添加和删除控件 控件产生“控件通知消息”,由它们的父类(承载窗口,例如对话框类)接收 控件通知消息的处理函数是其父类的成员函数 访问控件数据把控件当作窗口处理 使用GetDlgItem(控件ID)获得指向控件的指针用GetWindowText获得该控件中的文本 用SetWindowText设置该控件中的文本 本方法不需要为控件关联变量 对于有标题的控件(3种按钮、分组框等)处理的是标题 对于编辑框、组合框、静态文本处理的是框中的文本 CWnd *pEdit1=GetDlgItem(I
14、DC_EDIT1); CString str; pEdit1-GetWindowText(str); pEdit1-SetWindowText(); pEdit2-SetWindowText(str); 文档视图结构中类之间的访问 应用程序类(由CWinApp派生) 封装了初始化、创建窗口、消息循环等功能 可以在虚函数InitInstance( )中添加程序代码 窗口框架类CMainFrame(由CFrameWnd派生) 负责标题栏、菜单、工具栏、状态栏的管理 文档类(由CDocument派生) 负责组织、管理数据 视图类(由CView派生) 负责与用户交互,显示文档类管理的数据 用GetDo
15、cument( )返回文档类的指针 通常在OnDrow( )函数中显示数据 获得应用程序类对象地址 在程序的任何地方,可以使用函数AfxGetApp()返回本程序的应用程序类对象的地址 CWinApp* AfxGetApp( ); CWinApp是应用程序类的基类 获得主框架类对象地址 CWinApp类由CWinThread类派生CWinThread类有一个成员变量CWnd * m_pMainWnd 指向应用程序线程主窗口对象 对于基于文档视图的程序,指向主框架窗口 对于基于对话框的程序,指向对话框窗口 你的应用程序类继承了m_pMainWnd 利用m_pMainWnd可以可以获得主框架窗口(
16、或对话框窗口)对象的地址 注意m_pMainWnd是CWnd类指针,应把它强制转换为你的主框架类指针(或对话框类指针) CMainFrame *m_p=(CMainFrame*)AfxGetApp()-m_pMainWnd; 视图类中可以调用CWnd类函数获得其父框架类对象地址 CFrameWnd* CWnd: GetParentFrame( ) 在主框架类中获得视图类对象的地址 对于SDI程序调用函数:CView *CFrameWnd:GetActiveView( ) 返回当前视图类对象的地址(应进行强制类型转换)若无当先视图,返回NULL 对于MDI程序主框架窗口中无视图每个子框架窗口中才
17、有视图 要先找到当前框架窗口 CMDIChildWnd* CMDIFrameWnd: MDIGetActive( BOOL*pbMaximized = NULL ) const; 或CFrameWnd* CFrameWnd:GetActiveFrame() 再获得它的当前视图CView *CFrameWnd:GetActiveView( ) 在视图类中 获得文档类对象的地址CDocument* CView:GetDocument( ) 获得其父框架类对象地址CFrameWnd* CWnd: GetParentFrame( ) 在文档类中获得视图对象的地址 先获得视图列表中第一个课件视图的位置
18、使用文档类函数用返回的位置信息(POSITION 类型)获得该视图对象的地址使用文档类函数 返回rPosition 所表示的视图的地址rPosition 变为下一个视图的位置,无下一视图rPosition为NULL POSITION pos = GetFirstViewPosition(); while (pos != NULL) CView* pView = GetNextView(pos); pView-UpdateWindow(); 文档与视图的相互作用 在文档类中,当数据发生变化,要通知所有视图进行更新,用函数 void UpdateAllViews( ); /参数见MSDN 当CDo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windows 程序设计

限制150内