




已阅读5页,还剩106页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,第 9 章 Windows 程序开发概述,课件制作,2,主要内容,Windows 程序开发概述 Win32 应用程序 基于MFC的Windows程序开发 MFC 体系结构简洁 基于 MFC 的 Windows 对话框程序开发 基于 MFC 的 Windows 单文档程序开发 基于 MFC 的 Windows 多文档程序开发 GDI+ 编程简介,课件制作,3,9.1 Windows 程序开发概述,Windows 的消息处理机制 消息:事件发生时所产生的信息,如鼠标单击(按下、释放) Windows 消息包含程序执行过程中所发生的动作行为,如鼠标消息(移动、单击等),键盘消息(按键、释放、组合按键等) 消息驱动以非顺序的方法处理事件:程序启动后就一直等待消息的发生,当某一消息发生后就对其进行相应处理 消息的来源:用户输入的鼠标、键盘消息,程序自身的消息,其它程序产生的消息,操作系统产生的消息,用户发送的消息。当消息发生时,Windows就会将产生的消息分配到相关的程序中进行处理 消息的处理:通过专门的消息处理函数来执行,消息处理函数通常包括消息的名称和两个附加参数(wParam ,lParam),课件制作,4,9.1 Windows 程序开发概述,Windows API 简介 在Windows 下编程,通常要调用 Windows API (Application Program Interface)来实现 API 是提供用户程序(应用程序)与操作系统进行通信的接口层,程序需要操作系统完成某项功能时,一般需通过API 调用来完成 使用API的优点:当OS 升级时只要新版OS 提供了与旧版本兼容的API,应用程序就可以正常运行并获得新版本OS带来的好处 WinMain()函数 DOS 下C语言程序一定都是从主函数 main()开始,所有真正的Windows下的C+ 语言程序都是从入口函数 WinMain()开始执行 WinMain() 函数主要用于程序初始化、显示主窗口并进入消息循环,等待发生消息并进行处理,课件制作,5,9.1 Windows 程序开发概述,WinMain()函数 函数原型 WINAPI :在 windows.h 头文件定义的一个宏,把函数调用翻译成正确调用的约定 HINSTANCE 实例句柄。句柄,是一个被用来标识应用程序或对象如窗口、菜单、设备、文件等唯一整数,也可以是一个指向对象的指针。,int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevInstance, / handle to previous instance LPSTR lpCmdLine, / pointer to command line int nCmdShow / show state of window );,课件制作,6,9.1 Windows 程序开发概述,Windows 程序和Windows消息的基本流程,开始,初始化应用,初始化和创建应用窗口,进入消息循环并从消息队列得到一个消息,当前消息是否“退出”?,结束,程序是否定义了对此消息的处理,进行默认处理,处理消息,Y,N,课件制作,7,9.1 Windows 程序开发概述,Windows 应用程序常见类型 Windows Console Application (控制台应用程序,字符界面) Win32 Application (基于Windows API) Win32 Dynamic-Link Library MFC Application 基于对话框 单文档应用程序 多文档应用程序 MFC Application DLL,课件制作,8,9.2 Win32 应用程序,Win32 应用程序生成,选择Win32 Application,课件制作,9,9.2 Win32 应用程序,Win32 应用程序生成,课件制作,10,9.2 Win32 应用程序,Win32 应用程序生成,课件制作,11,9.2 Win32 应用程序,Win32 应用程序生成,课件制作,12,9.2 Win32 应用程序,Win32 应用程序生成,课件制作,13,9.2 Win32 应用程序,Win32 应用程序生成,课件制作,14,9.2 Win32 应用程序,Win32 应用程序生成,课件制作,15,9.2 Win32 应用程序,Win32 应用程序执行过程 Windows应用程序启动时的入口函数为WinMain函数,其第一个参数为操作系统分配的应用程序实例句柄 在WinMain函数中,首先调用MyRegisterClass函数注册窗口类 然后调用InitInstance函数,InitInstance函数将实例句柄保存在一个全局变量中,并调用CreateWindow函数创建程序主窗口,调用ShowWindow函数显示程序主窗口以及调用UpdateWindow函数更新程序主窗口 最后进入由GetMessage函数、TranslateMessage函数和DispatchMessage函数组成的消息循环,DispatchMessage函数将消息发送给窗口过程,课件制作,16,9.2 Win32 应用程序,Win32 应用程序执行过程 由WndProc窗口过程函数处理各种Windows消息,完成Windows应用程序所要完成的功能 当GetMessage函数捕获到WM_QUIT消息之后返回FALSE,于是消息循环终止,WinMain函数返回,程序执行结束,课件制作,17,9.2 Win32 应用程序,窗口的创建与显示 窗口结构的定义,typedef struct _WNDCLASSEX UINT cbSize; UINT style; /窗口风格 WNDPROC lpfnWndProc; /指定在窗口产生消息时调用的消息处理函数 int cbClsExtra; int cbWndExtra; HANDLE hInstance; /指定义窗口应用程序的句柄 HICON hIcon; /程序图标 HCURSOR hCursor; /鼠标样式 HBRUSH hbrBackground; /设置窗口背景色 LPCTSTR lpszMenuName; /设置窗口菜单 LPCTSTR lpszClassName; /设置窗口类名 HICON hIconSm; WNDCLASSEX;,课件制作,18,9.2 Win32 应用程序,窗口的创建与显示 窗口结构的定义,WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MYWIN32APP); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName= (LPCSTR)IDC_MYWIN32APP; wcex.lpszClassName = szWindowClass; / MyWin32App wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);,课件制作,19,9.2 Win32 应用程序,窗口的创建与显示 窗口注册 RegisterClassEx( 创建窗口,HWND CreateWindowEx( DWORD dwExStyle, / extended window style LPCTSTR lpClassName, / pointer to registered class name LPCTSTR lpWindowName, / pointer to window name DWORD dwStyle, / window style int x, / horizontal position of window int y, / vertical position of window int nWidth, / window width int nHeight, / window height HWND hWndParent, / handle to parent or owner window HMENU hMenu, / handle to menu, or child-window identifier HINSTANCE hInstance, / handle to application instance LPVOID lpParam / pointer to window-creation data );,课件制作,20,9.2 Win32 应用程序,窗口的创建与显示 创建窗口,课件制作,21,9.2 Win32 应用程序,窗口的创建与显示 创建窗口,课件制作,22,9.2 Win32 应用程序,窗口的创建与显示 创建窗口,课件制作,23,9.2 Win32 应用程序,窗口的创建与显示 创建窗口,课件制作,24,9.2 Win32 应用程序,窗口的创建与显示 创建窗口,hInst = hInstance; / Store instance handle in our global variable hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL ); if (!hWnd) return FALSE; ,课件制作,25,9.2 Win32 应用程序,窗口的创建与显示 窗口的显示与更新,The ShowWindow function sets the specified windows show state. BOOL ShowWindow( HWND hWnd, / handle to window int nCmdShow / show state of window );,BOOL UpdateWindow( HWND hWnd / handle of window );,ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);,课件制作,26,9.2 Win32 应用程序,消息循环 GetMessage() TranslateMessage() DispatchMessage(),BOOL GetMessage( LPMSG lpMsg, / address of structure with message HWND hWnd, / handle of window UINT wMsgFilterMin, / first message UINT wMsgFilterMax / last message );,BOOL TranslateMessage( CONST MSG *lpMsg / address of structure with message );,LONG DispatchMessage( CONST MSG *lpmsg / pointer to structure with message );,课件制作,27,9.2 Win32 应用程序,消息循环 PeekMessage() PostMessage(),BOOL PeekMessage( LPMSG lpMsg, / pointer to structure for message HWND hWnd, / handle to window UINT wMsgFilterMin, / first message UINT wMsgFilterMax, / last message UINT wRemoveMsg / removal flags );,BOOL PostMessage( HWND hWnd, / handle of destination window UINT Msg, / message to post WPARAM wParam, / first message parameter LPARAM lParam / second message parameter );,课件制作,28,9.2 Win32 应用程序,消息循环 SendMessage() 消息结构,LRESULT SendMessage( HWND hWnd, / handle of destination window UINT Msg, / message to send WPARAM wParam, / first message parameter LPARAM lParam / second message parameter );,typedef struct tagMSG / msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,typedef struct tagPOINT LONG x; LONG y; POINT;,课件制作,29,9.2 Win32 应用程序,消息处理 消息处理函数 常用Windows消息,LRESULT CALLBACK WndProc( HWND hwnd, / handle to window UINT uMsg, / message identifier WPARAM wParam, / first message parameter LPARAM lParam / second message parameter );,Keyboard Input Messages The following messages are used to receive and process keyboard input. WM_ACTIVATE WM_CHAR WM_DEADCHAR WM_GETHOTKEY WM_HOTKEY WM_KEYDOWN WM_KEYUP WM_KILLFOCUS WM_SETFOCUS WM_SETHOTKEY WM_SYSCHAR WM_SYSDEADCHAR WM_SYSKEYDOWN WM_SYSKEYUP,课件制作,30,9.2 Win32 应用程序,消息处理 常用Windows消息,Mouse Input Messages The following messages are used with mouse input. WM_CAPTURECHANGED WM_LBUTTONDBLCLK WM_LBUTTONDOWN WM_LBUTTONUP WM_MBUTTONDBLCLK WM_MBUTTONDOWN WM_MBUTTONUP WM_MOUSEACTIVATE WM_MOUSEMOVE WM_MOUSEWHEEL WM_NCHITTEST WM_NCLBUTTONDBLCLK WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMBUTTONDBLCLK WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMOUSEMOVE WM_NCRBUTTONDBLCLK WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_RBUTTONDBLCLK WM_RBUTTONDOWN WM_RBUTTONUP,课件制作,31,9.2 Win32 应用程序,消息处理 常用Windows消息,Window Messages The following messages are used to create and manage windows. WM_ACTIVATE WM_ACTIVATEAPP WM_CANCELMODE WM_CHILDACTIVATE WM_CLOSE WM_COMPACTING WM_CREATE WM_DESTROY WM_ENABLE WM_ENTERSIZEMOVE WM_EXITSIZEMOVE WM_GETICON WM_GETMINMAXINFO WM_GETTEXT WM_GETTEXTLENGTH WM_INPUTLANGCHANGE WM_INPUTLANGCHANGEREQUEST WM_MOVE WM_MOVING WM_NCACTIVATE WM_NCCALCSIZE WM_NCCREATE WM_NCDESTROY WM_PARENTNOTIFY WM_QUERYDRAGICON WM_QUERYOPEN WM_QUIT WM_SETICON WM_SETTEXT WM_SETTINGCHANGE WM_SHOWWINDOW WM_SIZE WM_SIZING WM_STYLECHANGED WM_STYLECHANGING WM_USERCHANGED WM_WINDOWPOSCHANGED WM_WINDOWPOSCHANGING WM_WININICHANGE,课件制作,32,9.2 Win32 应用程序,消息处理 Windows消息处理示例,switch (message) case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); / Parse the menu selections: switch (wmId) case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break;,课件制作,33,9.2 Win32 应用程序,消息处理 Windows消息处理示例,switch (message) case WM_PAINT: hdc = BeginPaint(hWnd, ,课件制作,34,9.2 Win32 应用程序,Win32 应用程序运行机制,鼠标/键盘消息,WinMain() WNDCLASS wcApp RegisterClass(); CreateWindow(); ShowWindow(); UpdateWindow(); while(GetMessage( ,WndProc() switch(msg) return DefWindowProc(); 返回,应用程序自身或其它程序产生的消息,程序消息队列,系统消息队列,提取消息,发送消息,课件制作,35,9.2 Win32 应用程序,消息提示对话框,int MessageBox( HWND hWnd, / handle of owner window LPCTSTR lpText, / address of text in message box LPCTSTR lpCaption, / address of title of message box UINT uType / style of message box ); int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );,课件制作,36,9.2 Win32 应用程序,消息提示对话框,课件制作,37,9.2 Win32 应用程序,Windows 应用程序中的命名法 匈牙利命名法:一种编程时的命名规范,其基本原则是 在命名标志符时,要选择易读的标志符名称 可以适当采用英文缩写,如szAppTitle, wMsgFilterMin 可读性比简洁性更重要 最好不要使用下划线、连字符或任何其他非字母数字字符,不要使用中文标志 长度要适宜,不要过长 不要出现局部变量与全局变量同名的情况 表示常量或宏定义的标志符用大写字母表示,以表示与普通标志符的区别,变量名 := 属性前缀 + 类型 + 对象描述,课件制作,38,9.2 Win32 应用程序,Windows 应用程序中的命名法 范围前缀,课件制作,39,9.2 Win32 应用程序,Windows 应用程序中的命名法 常用的一般数据类型前缀,课件制作,40,9.2 Win32 应用程序,Windows 应用程序中的命名法 常用的一般数据类型前缀,课件制作,41,9.2 Win32 应用程序,Windows 应用程序中的命名法 常用Windows对象名称缩写,课件制作,42,9.2 Win32 应用程序,Windows 应用程序中的命名法 常用宏定义命名 常用数据类型,课件制作,43,9.2 Win32 应用程序,Windows 应用程序中的命名法 常用数据类型,课件制作,44,9.2 Win32 应用程序,Windows 应用程序中的命名法 常用数据类型,课件制作,45,9.2 Win32 应用程序,Win32 应用程序实例分析 Win32 应用程序的使用 实时性要求较高场合,如游戏,工业数据采集与控制系统 设备驱动程序 Win32 应用程序的缺点 编写复杂,复用性较弱 不适合大型应用系统,课件制作,46,9.3 基于 MFC 的 Windows 程序开发,MFC 体系结构 基本概念 MFC封装了Win32 API,目前已包括有200多个类。 MFC是一个类层次体系,基类是CObject,其他类大部分是采用单重继承从该类直接或间接派生而来 常用的以CObject为基类的类层次结构,课件制作,47,9.3 基于 MFC 的 Windows 程序开发,MFC 体系结构 常用的以CObject为基类的类层次结构,课件制作,48,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 MFC应用程序框架分类 基于对话框的应用程序 单文档界面应用程序(简称SDI) 多文档界面应用程序(简称MDI) 基于对话框的应用程序,CH9_2:实现如左图所示的对话框应用程序,CDialog CFileDialog CEdit CButton CFile CString AfxMessageBox,课件制作,49,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 基于文档/视图结构的应用程序框架,CH9_3:实现如左图所示的文档/视图结构应用程序的用户界面,课件制作,50,9.3 基于 MFC 的 Windows 程序开发,MFC 体系结构 部分CObject派生类的功能 CCmdTarget:封装了MFC的消息映射机制,是MFC类库中消息映射体系的基类,希望接收系统事件和窗口消息的类都从它派生 CWinThread:该类的一个对象代表应用程序的一个执行线程,主线程通常由CWinThread的派生类CWinApp的对象提供 CWinApp:派生Windows应用程序对象的基类 CWnd:对创建、操纵窗口类的API函数进行了封装,提供了MFC中所有窗口类的基本功能 CFrameWnd: SDI应用程序的主框架窗口的基类,也是所有其他框架窗口类的基类 CDocument:应用程序文档的基类 CView:应用程序视图的基类,课件制作,51,9.3 基于 MFC 的 Windows 程序开发,MFC 体系结构 部分CObject派生类的功能 CDialog:所有对话框(模态或者非模态)的基类 CFile:提供二进制磁盘文件的访问接口 CDC:设备上下文类的基类,封装了绘图的所有功能函数 CException:所有异常的基类,用于处理各种异常 用MFC Appwizard 自动生成Windows程序 应用程序框架 通常是指一个完整的程序模型,具备标准应用软件所需的一切基本功能,如文件存取、打印预览等,以及这些功能的使用接口,如工具栏、状态栏、菜单等 提供一个一般应用程序所需要的全部面向对象软件组件的集合,课件制作,52,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 SDI应用程序的组成:一个典型的SDI应用程序一般由四个类组成 主框架窗口类(CMainFrame) 由AppWizard自动添加 基类是CFrameWnd,框架类负责管理程序的主窗口,包含窗口边框、标题栏、菜单栏、系统菜单栏、工具栏、状态栏等各种元素。 类的定义和实现文件分别是MainFrm.h和MainFrm.cpp 应用程序类(CMFCDemoSDIApp) 基类是CWinApp,应用程序类是应用程序运行的基础,用来管理整个应用程序,封装了Windows应用程序要做的初始化、运行和终止三大主要任务。 该类的定义和实现文件分别是MFCDemoSDI.h和MFCDemoSDI.cpp。基类是CWinApp,应用程序类是应用程序运行的基础,用来管理整个应用程序,封装了Windows应用程序要做的初始化、运行和终止三大主要任务。 该类的定义和实现文件分别是MFCDemoSDI.h和MFCDemoSDI.cpp。,课件制作,53,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 SDI应用程序的组成:一个典型的SDI应用程序一般由四个类组成 文档类(CMFCDemoSDIDoc) 基类是CDocument,文档类封装了应用程序的数据管理功能,负责存放程序数据、读出数据并进行I/O操作。 该类的定义和实现文件分别是MFCDemoSDIDoc.h和MFCDemoSDIDoc.cpp。 视图类(CMFCDemoSDIView) 基类是CView,视图类负责管理视图窗口,显示程序中的数据和处理用户输入,而数据是从文档类中获得,视图窗口是框架窗口的子窗口,显示在主框架窗口的客户区中。 该类的定义和实现文件分别是 MFCDemoSDIView.h 和MFCDemoSDIView.cpp。,课件制作,54,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 MDI应用程序 在MDI应用程序中,除了具有SDI应用程序中的四个类外,还包括子框架窗口类 主框架窗口类的基类为CMDIFrameWnd类,子框架窗口(文档框架窗口)类的基类为CMDIChildWnd类,课件制作,55,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 工程文件的组成 文件夹 Debug:用于存放编译、链接时产生的中间文件和可执行文件 Res:用于存放工程的资源文件 工程文件(以C:TempMFCDemoSDI 为例) MFCDemoSDI.dsw:工作区文件,保存了工程所属的工作区信息 MFCDemoSDI.dsp:工程文件,保存了用户所建工程的有关信息 MFCDemoSDI.opt:工作区选项文件,保存了用户为所建工作区所定制的一些选项,当每次打开该工作区时可自动设置用户定制的选项状态 MFCDemoSDI.clw:为ClassWizard数据库文件,存放由ClassWizard使用的信息,Wizard还使用这个文件来存储信息,以便创建和编辑消息映射、对话框数据映射、以及创建成员函数的原型,课件制作,56,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 工程文件的组成 工程文件(以C:TempMFCDemoSDI为例) MFCDemoSDI.ncb:非编译的浏览文件,包含了由分析器产生的一些信息,可被ClassView、WizardBar和Component Gallery利用 预编译头文件: StdAfx.h 和 StdAfx.cpp,这两个文件用来产生预编译头文件 MFCDemoSDI.pch 和一个OBJ 文件 StdAfx.obj 资源文件 MFCDemoSDI.rc 和 Resource.h:包含了一般MFC应用程序用到的所有资源,如菜单、加速键、字符串表以及About对话框、图标文件、位图文件 resMFCDemoSDI.rc2:包含Visual C+不能直接编辑的资源,可以将所有不能由资源编辑器编辑的资源放置到这个文件中 resMFCDemoSDI.ico:图标文件 resToolbar.bmp:用于创建工具栏按钮的位图文件,课件制作,57,9.3 基于 MFC 的 Windows 程序开发,用MFC Appwizard 自动生成Windows程序 工程文件的组成 帮助文件:若用户在MFC AppWizard-Step4 of 6 对话框中选择了“提供上下文相关帮助”,则会在工程目录上生成一个hlp子目录,并产生一系列所需帮助文件,课件制作,58,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 应用程序模式 过程控制模式 在MS-DOS的控制台应用程序中,main函数是程序的入口,按照程序语句的执行流程来控制程序代码的执行 执行的顺序和方式是在编写程序时设置好的,这种程序模式称为过程控制模式 事件驱动模式:Windows程序的控制流程不再由事件的预定发生顺序来决定,而是由实际运行时各种事件的实际发生来触发 Windows消息机制 Windows消息分类 标准Windows消息:以WM_为前缀的消息(除WM_COMMAND) 控件通知消息:以WM_COMMAND为消息名,由编辑框、列表框等控件或子窗口发给其父窗口的通知消息,课件制作,59,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 Windows消息机制 Windows消息分类 命令消息:当用户选择菜单、工具栏、加速键时产生的消息,也以WM_COMMAND为消息名,在消息中包含有命令的标识符(ID),以区分具体的命令 MSG结构体,typedef struct tagMSG HWND hwnd ; /接收消息的窗口句柄 UINT message ; /消息类型 WPARAM wParam ; LPARAM lParam ; /消息的附加信息 DWORD time ; /消息发送时间 POINT pt ; /消息发送时光标在屏幕上的位置 MSG ;,课件制作,60,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 Windows消息机制 消息队列 系统消息队列 应用程序(消息)队列 窗口过程 每个窗口会有一个称为窗口过程(WndProc)的回调函数,它带有四个参数:窗口句柄,消息ID,和两个消息参数(wParam, lParam) 当窗口收到消息时系统就会调用此窗口过程来处理消息,即消息响应 任何一个窗口类都有一个窗口过程,同一个类的窗口使用同样的窗口过程来响应消息 Windows消息从产生到响应处理的过程,课件制作,61,9.3 基于 MFC 的 Windows 程序开发,系统或外部输入,Windows系统消息队列,应用程序1,消息队列,应用程序m,消息队列,窗口1 的窗口过程,窗口 n 的窗口过程,将事件转换为消息,.,.,控件1,控件 k,.,应用程序1,WinMain 函数,消息循环,课件制作,62,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 Windows 消息机制 Windows消息从产生到响应处理的过程 MFC 消息映射机制 MFC把所有图形用户界面元素(如对话框、按钮、编辑框和菜单等)以类的方式封装,使用消息映射宏将这些图形用户界面元素所发出的消息“映射”到消息处理函数进行处理,while (GetMessage( ,课件制作,63,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 MFC 消息映射机制 消息处理函数是以 CCmdTarget 为基类的派生类成员函数,CCmdTarget类是MFC处理命令消息的基础和核心 在VC+中建立消息映射必须遵循的规范 声明消息处理函数 首先,在需要进行消息处理的类定义头文件中,在成员定义末尾加入DECLARE_MESSAGE_MAP宏,其语法格式如下: DECLARE_MESSAGE_MAP() 其次,在需要进行消息处理的类的定义中声明消息处理函数,其语法格式如下: /AFX_MSG(子类名) afx_msg 类型 函数名(形参表); /AFX_MSG,课件制作,64,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 MFC 消息映射机制 在VC+中建立消息映射必须遵循的规范 建立消息与处理函数之间的映射 在需要进行消息处理的类的实现文件中加入如下代码 添加消息处理函数:在需要进行消息处理的类的实现文件中添加消息处理函数,其语法格式如下,BEGIN_MESSAGE_MAP(子类名,父类名) /消息映射宏定义或消息映射语句,一般有若干个 ON_COMMAND.(消息名或控制号,处理函数名) ON_WM_ END_MESSAGE_MAP(),类型 类名:处理函数名(形参表) /处理代码 ,消息映射的这三项内容既可手工加入,也可以使用ClassWizard工具 ClassWizard 为消息处理程序自动生成函数原型和空的函数定义,用户需要根据实际功能添加具体的消息处理函数体代码,课件制作,65,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 MFC命令消息的传递机制 命令消息在应用程序类、文档类、视图类、以及框架窗口类中都可以进行处理 当产生一个命令消息时,该消息的接收和处理对象有不同的优先级的,消息是按一定的路径进行传递的,例 CH9_3: 在上述 MFCDemoSDI工程添加菜单项“测试”,并分别在视图类、文档类、框架类和应用程序类中为其添加消息映射,然后测试消息对视图对象、文档对象、框架对象和应用程序对象的响应优先级,MainFrame ViewDocApp,课件制作,66,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 MFC命令消息的传递机制 命令消息的处理过程,开始,主,/,子框架窗口对象,活动视图对象,找到消息处理函数,文档对象,Y,处理命令消息,搜索视图消息映射表,搜索主,/,子框架窗,口消息映射表,命令消息,找到消息处理函数,搜索文档消,息映射表,Y,N,N,找到消息处理函数,Y,N,由应用程序对,象处理消息,结束,课件制作,67,9.3 基于 MFC 的 Windows 程序开发,MFC消息映射 MFC命令消息的传递机制 命令消息的处理过程 用户消息(鼠标、键盘输入等)会先发往主框架窗口对象(对于MDI应用程序,会再将消息的处理机会传递给当前活动的MDI子框架窗口) 主/子框架窗口对象则将消息传递给当前活动视图对象 视图对象先搜索自己的消息映射,如果没有找到该消息的处理函数,则将消息传递给与此视图关联的文档对象 如果文档对象也没有处理该消息则又将消息传递给文档模板对象 如果在文档模板对象中也没有找到该消息的处理函数,则消息又被传回主/子框架窗口对象 主/子框架窗口对象搜索自己的消息映射(对于MDI应用程序,如果子框架窗口中没有处理函数,命令消息就被传回给主框架窗口),如果找到就进行处理 如果在主框架窗口对象没有处理该消息,则由应用程序对象来处理未被处理的命令消息,课件制作,68,9.3 基于 MFC 的 Windows 程序开发,使用ClassWizard工具 打开ClassWizard工具 主要功能 使用ClassWizard 进行消息映射 使用ClassWizard 添加类 使用ClassWizard 添加成员变量 覆盖基类虚成员函数 编程演示 使用ClassWizard 进行消息映射 使用ClassWizard 添加类(插入对话框资源),需要删除某个消息映射函数,需要首先用 ClassWizard 工具删除消息映射入口项和消息处理成员函数的函数原型,然后在该消息映射函数所在的实现文件(.cpp)中手动删除该消息处理成员函数的定义代码,课件制作,69,9.3 基于 MFC 的 Windows 程序开发,使用ClassWizard工具 编程演示 使用 ClassWizard 添加成员变量 利用ClassWizard 可以方便地向类中添加成员变量,并将这些成员变量与对话框或窗口中的控件关联起来,当控件的值改变时,所对应的成员变量的值也跟着发生变化 演示:向 CLoginDialog 类中添加成员变量,使它们与相应的控件相关联,例 CH9_4: 完成登录对话框,要求在主界面显示之前弹出一个登录对话框,由用户输入用户名和密码,如果输入正确,则程序继续执行,否则程序终止,课件制作,70,9.3 基于 MFC 的 Windows 程序开发,使用ClassWizard工具 编程演示 覆盖基类虚成员函数 在MFC类库中,很多成员函数在声明时都有virtual关键字,即它们都是虚成员函数 当创建基于MFC的应用程序时,在用户的派生类中往往需要重新定义基类的虚成员函数,这样当通过基类对象指针(或引用)调用虚成员函数时,可以实现运行时的多态性 说明 在MFCDemoSDIDoc.h中可以看到该虚成员函数的声明 在MFCDemoSDIDoc.cpp中可以看到该虚成员函数的定义 Serialize函数用来实现文件的串行化操作,例 CH9_5: 在完成的 MFCDemoSDI工程的文档类 CMFCDemoSDIDoc 中添加 Serialize 成员函数,从而覆盖基类 CDocument 中定义的 Serialize 虚成员函数,课件制作,71,9.3 基于 MFC 的 Windows 程序开发,使用ClassWizard工具 编程演示 覆盖基类虚成员函数 说明 当用户选择了“打开”、“保存”或“另存为”命令,程序框架为这个文件创建CFile对象,关联到新创建的 CArchive 对象上,并设置 CArchive 对象的 “store”或“load”标记,用这个CArchive对象来调用CDocument派生类的Serialize成员函数 在 Serialize 函数完成读写操作返回后,自动删除 CArchive 和 CFile 对象,课件制作,72,9.3 基于 MFC 的 Windows 程序开发,文档/视图结构 在MFC AppWizard-Step1向导对话框中,当选择SDI或MDI应用程序时,系统默认选择支持文档/视图结构 当选择基于对话框的应用程序时,“文档/视图结构支持”复选框是被禁用的,即此时系统不支持文档/视图结构 文档是用来保存数据以及关于数据的处理的,每当MFC SDI/MDI响应“File|Open”或 “File|New”菜单命令的时候,都会打开一份文档 视图在Windows中是一个从CView类派生出来的窗口,也是一个可视化的矩形区域 视图用来表示文档的数据,文档的内容通过视图窗口显示给用户,这种文档和视图的结合,称为“文档/视图结构”,课件制作,73,9.3 基于 MFC 的 Windows 程序开发,文档/视图结构 每个视图必须依附于一个框架(在SDI中依附于MainFrame,在MDI中依附于ChildFrame) 框架是一个Windows 窗口,但是在框架上可以放置菜单、工具栏、状态栏等,视图放在框架的客户区 文档与视图的关系如下图,课件制作,74,9.3 基于 MFC 的 Windows 程序开发,文档/视图结构 文档模板类(CDocTemplate) 作用:在MFC中,一个应用程序的主线由应用类体现,而应用类又通过文档模板类在运行时动态创建和管理文档类、视图类和框架窗口类,将它们组成一个有机的整体,共同完成程序的任务 是一个抽象基类,它定义了文档模板的基本处理函数(或称接口),用于支持文档模板操作 CDocTemplate类有两个派生类 CSingleDocTemplate:用于SDI程序 CMultipleDocTemplate:用于MDI程序 这三个类的声明在 “afxwin.h” 文件中,课件制作,75,9.3 基于 MFC 的 Windows 程序开发,文档/视图结构 文档模板类(CDocTemplate) 在 SDI 程序中文档模板类的使用(以S1工程为例)在CS1App 的InitInstance函数中,CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, /指定这个文档显示时候采用的菜单资源 RUNTIME_CLASS(CS1Doc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CS1View); AddDocTemplate(pDocTemplate);,课件制作,76,9.3 基于 MFC 的 Windows 程序开发,文档/视图结构 文档模板类(CDocTemplate) 在MDI 程序中文档模板类的使用(以MFCDemoSDI工程为例)在 CMFCDemoSDIApp 的 InitInstance函数中,CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_S1TYPE, /同上 RUNTIME_CLASS(CS1Doc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CS1View); AddDocT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术教师专业素养与教学能力提升培训
- 课程策划培训
- 客服主管培训
- 喷绒工艺流程图
- 培训成果总结汇报
- 进修教师培训开班仪式
- 合作协议合同简单模板:美甲店专用
- 国际贸易合同签订与履行实训报告
- 公共设施装饰工程合同
- 设备租赁合同版
- 第十二讲 建设社会主义生态文明PPT习概论2023优化版教学课件
- 工商管理实习周记十篇
- 幼儿园体育游戏活动评价表
- 2023年通管局安全员考试-培训及考试题库(导出版)
- GB/T 4857.22-1998包装运输包装件单元货物稳定性试验方法
- GB/T 25074-2010太阳能级多晶硅
- GB/T 23842-2009无机化工产品中硅含量测定通用方法还原硅钼酸盐分光光度法
- GA/T 1217-2015光纤振动入侵探测器技术要求
- 特种陶瓷介绍课件
- 有机物污染(环境化学)课件
- 安全生产培训合格证书样本
评论
0/150
提交评论