Chap8_VC创建Windows程序资料_第1页
Chap8_VC创建Windows程序资料_第2页
Chap8_VC创建Windows程序资料_第3页
Chap8_VC创建Windows程序资料_第4页
Chap8_VC创建Windows程序资料_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第8讲讲 在在VC中创建中创建Windows应用程序应用程序Windows 应用程序概述应用程序概述窗口窗口消息驱动消息驱动创建创建Windows应用程序的方法应用程序的方法利用利用MFC创建创建Windows应用程序应用程序MFC概述概述创建基于对话框的创建基于对话框的Windows应用程序应用程序*多对话框应用程序多对话框应用程序控件控件 1 Windows应用程序概述 WindowsWindows的应用程序具有以下主要特点:的应用程序具有以下主要特点:u具有标准的具有标准的GUIGUI:窗口程序:窗口程序u采用采用“消息传递,事件驱动消息传递,事件驱动”的运行机制,即根的运行机制,即根

2、据据WindowsWindows发送的消息来处理用户的输入。发送的消息来处理用户的输入。WindowsWindows应用程序是被动工作的,它并不知道自己应用程序是被动工作的,它并不知道自己下一步该做什么,只是等待消息。当发生了一个下一步该做什么,只是等待消息。当发生了一个事件,操作系统将事件转换成消息传递给应用程事件,操作系统将事件转换成消息传递给应用程序,应用程序调用相应的消息处理函数,处理完序,应用程序调用相应的消息处理函数,处理完毕后等待下一个消息。毕后等待下一个消息。1.1 窗口的界面元素窗口的界面元素垂直滚动条垂直滚动条标题栏标题栏菜单栏菜单栏关闭按钮关闭按钮最小化按钮最小化按钮最大

3、化按钮最大化按钮水平滚动条水平滚动条窗口边框窗口边框客户客户区区u 窗口是应用程序与用户交互的界面,应用程序通过窗口传递信息给窗口是应用程序与用户交互的界面,应用程序通过窗口传递信息给用户,同样,用户通过窗口输入数据,给应用程序发布命令。用户,同样,用户通过窗口输入数据,给应用程序发布命令。u 窗口元素以对象方式组织窗口元素以对象方式组织u 一个应用程序可由多个窗口组成,程序的运行过程是窗口之间,窗一个应用程序可由多个窗口组成,程序的运行过程是窗口之间,窗口与系统,窗口与用户之间交换并处理数据的过程。口与系统,窗口与用户之间交换并处理数据的过程。1.2 Windows应用程序的消息驱动应用程序

4、的消息驱动 u消息用于通知某个事件的产生消息用于通知某个事件的产生u事件驱动的程序的逻辑顺序是按事件的产生而决定的,事件事件驱动的程序的逻辑顺序是按事件的产生而决定的,事件的产生不是预先定义的,有着随机性。的产生不是预先定义的,有着随机性。Windows应用程序消息队列键盘消息鼠标消息其它消息处理消息取消消息Windows程序事件驱动原理MSGtypedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt;MSG;消息的类型消息的类型u输入消息输入消息: :由键盘

5、鼠标操作产生由键盘鼠标操作产生. .u控件消息控件消息: :操作窗口上的控件对操作窗口上的控件对象时产生象时产生. .u系统消息系统消息: :对程序化的事件或系对程序化的事件或系统时钟中断做出反应统时钟中断做出反应. .u用户消息用户消息: :程序员自己定义并在程序员自己定义并在应用程序中主动发出应用程序中主动发出. .消息是消息是WindowsWindows应用程序运行的核心工作机制应用程序运行的核心工作机制, ,由一个结构体由一个结构体MSGMSG来定义来定义: :1.3 用用Visual C+编写编写Windows应用程应用程序主要有两种方法序主要有两种方法Win32Win32应用程序的

6、主函数为:应用程序的主函数为:WinmainWinmain()()u使用使用 Windows Windows 提供的应用程序接口函数提供的应用程序接口函数API(Application Programming Interface)API(Application Programming Interface)u使用使用 MicrosoftMicrosoft提供的微软基础类提供的微软基础类 MFC MFC (Microsoft Foundation Class)(Microsoft Foundation Class)。APIuWindows应用程序的主函数是应用程序的主函数是WinMain(),Wi

7、nMain()具有相对固定的程序结构,完成三个任务:具有相对固定的程序结构,完成三个任务:n注册窗口类:将窗口的基本属性(边框、标题栏文字等)报告给系统.注册成功后才能创建窗口。 n创建并初始化窗口:使用窗口类创建窗口。n创建消息循环u一般的程序都会套用这个程序框架,然后在此基础上加一般的程序都会套用这个程序框架,然后在此基础上加以修改,以满足新的需要。以修改,以满足新的需要。u直接使用直接使用API函数进行函数进行Windows编程时,需要熟记常用编程时,需要熟记常用的的API函数。函数。/包含应用程序中所需的数据类型和数据结构的定义包含应用程序中所需的数据类型和数据结构的定义#includ

8、e/窗口函数说明窗口函数说明LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); /- 以下初始化窗口类以下初始化窗口类 -int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) HWND hwnd ; MSG Msg ; WNDCLASS wc; char szApplicationName= Exam3_1Window;/窗口标题名窗口标题名/定义窗口类定义窗口类wc.style=CS_HREDRAW|CS

9、_VREDRAW; /定义窗口类型为当窗口大小变化时窗口重画定义窗口类型为当窗口大小变化时窗口重画wc.lpfnWndProc=WndProc;/定义窗口处理函数定义窗口处理函数wc.cbClsExtra=0;/窗口类无扩展窗口类无扩展wc.cbWndExtra=0;/窗口实例无扩展窗口实例无扩展wc.hInstance=hInstance;/当前实例句柄当前实例句柄wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);/窗口最小化图标为缺省图标窗口最小化图标为缺省图标 wc.hCursor=LoadCursor(NULL,IDC_ARROW) ;/窗口采用箭头光标窗

10、口采用箭头光标wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/窗口背景为白色窗口背景为白色wc.lpszMenuName=NULL; /窗口中无菜单窗口中无菜单wc.lpszClassName= szApplicationName;/定义应用程序标题定义应用程序标题/-注册窗口类注册窗口类-RegisterClass( &wc);/- 创建窗口创建窗口 -hwnd=CreateWindow(szApplicationName,/窗口类名窗口类名szApplicationName,/窗口的标题名窗口的标题名WS_OVERLAPPEDWI

11、NDOW,/窗口的风格窗口的风格CW_USEDEFAULT,CW_USEDEFAULT,/窗口左上角坐标为缺省值窗口左上角坐标为缺省值CW_USEDEFAULT,CW_USEDEFAULT,/窗口的高和宽为缺省值窗口的高和宽为缺省值NULL,/此窗口无父窗口此窗口无父窗口NULL,/此窗口无主菜单此窗口无主菜单hInstance,/创建此窗口的应用程序的当前句柄创建此窗口的应用程序的当前句柄NULL );/- 显示窗口显示窗口 -ShowWindow( hwnd, nCmdShow) ;/- 绘制用户区绘制用户区 -UpdateWindow(hwnd);/- 消消 息息 循循 环环 - whi

12、le( GetMessage(&Msg, NULL, 0, 0)TranslateMessage( &Msg) ;DispatchMessage( &Msg) ;return Msg.wParam; /消息循环结束即程序终止时将信息返回系统消息循环结束即程序终止时将信息返回系统/-窗口函数窗口函数-LRESULT CALLBACK WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) switch(message) case WM_DESTROY:PostQuitMessage(0);/ 调用调用PostQuitMessage

13、发出发出WM_QUIT消息消息default:/缺省时采用系统消息缺省处理函数缺省时采用系统消息缺省处理函数return DefWindowProc(hwnd,message,wParam,lParam); return 0;Windows应用程序组成应用程序组成 u主函数主函数The WinMain functionu窗口处理函数窗口处理函数A window procedure functionumessage loop (消息循环消息循环): switchThe WinMain Function主函数主函数Windows应用程序的主函数为应用程序的主函数为WinMain()u在操作系统注册

14、窗口类。在操作系统注册窗口类。u在内存中创建窗口,并初始化它的属性,使窗口正确显示。在内存中创建窗口,并初始化它的属性,使窗口正确显示。u创建一个消息循环,检查窗口有消息进入消息队列创建一个消息循环,检查窗口有消息进入消息队列u当消息循环检测到关闭窗口消息当消息循环检测到关闭窗口消息WM_QUIT时,终止程序运行时,终止程序运行while (GetMessage(&Msg, NULL, 0, 0) if (!TranslateAccelerator(Msg.hwnd, hAccelTable, &msg) TranslateMessage(&Msg);DispatchMessage(&Msg)

15、;u GetMessage()函数检查应用程序的消息队列,发现队列中有消息,函数检查应用程序的消息队列,发现队列中有消息,取出消息复制到取出消息复制到MSG结构体变量中,同时返回结构体变量中,同时返回TRUE。u TRanslateMessage()将来自键盘的命令翻译为消息的将来自键盘的命令翻译为消息的ID标识。标识。u DispatchMessage()将消息发给相应的窗口函数。将消息发给相应的窗口函数。The Window Procedure窗口处理函数窗口处理函数u窗口处理函数窗口处理函数WndProc,由用户自定义函数,由用户自定义函数u决定窗口在客户区显示的内容,和窗口对用户输决定

16、窗口在客户区显示的内容,和窗口对用户输入如何反应:入如何反应: switch(message) u处理开发者添加的消息处理代码,如果不存在开处理开发者添加的消息处理代码,如果不存在开发者添加的消息处理代码,将由发者添加的消息处理代码,将由 default window procedure函数处理函数处理 。2 利用利用MFC创建创建Windows应用程序应用程序uMFC类简介类简介u 创建基于对话框的创建基于对话框的Windows应用程序应用程序l MicrosoftMicrosoft建立了一个建立了一个AFXAFX小组小组(Application Framework(Application

17、Framework,应用程序框架,应用程序框架) )。当时当时Borland Borland 公司的应用程序框架公司的应用程序框架OWL(object Windows Language)OWL(object Windows Language)已相当已相当成功。成功。AFXAFX小组象小组象OWLOWL那样,设计了一个高度抽象那样,设计了一个高度抽象Windows APIWindows API的一个类库。的一个类库。l 他们采用自顶向下的设计方法,逐步将对象抽象出来,并施加到他们采用自顶向下的设计方法,逐步将对象抽象出来,并施加到WindowsWindows上。上。结果发现这个类库偏离结果发现这

18、个类库偏离Windows APIWindows API实在太远,过分抽象并没有太大的实用实在太远,过分抽象并没有太大的实用性,相反大大降低了应用程序的效率。性,相反大大降低了应用程序的效率。l 于是他们放弃了整个于是他们放弃了整个AFXAFX类库,对类库进行重新设计。这次采用了自底向上类库,对类库进行重新设计。这次采用了自底向上的方法,从已有的的方法,从已有的Windows APIWindows API着手,将类建立在着手,将类建立在Windows APIWindows API对象基础上,对象基础上,设计出后来成为设计出后来成为MFC1.0MFC1.0的一个类库。但是现在仍可看到的一个类库。但

19、是现在仍可看到AFXAFX时期的痕迹,许时期的痕迹,许多源程序文件有多源程序文件有afxafx前缀,如前缀,如afxabort.cpp,afxmem.cppafxabort.cpp,afxmem.cpp。MFCMFC延用了许多延用了许多AFXAFX类库的宏,因此我们经常会看到以类库的宏,因此我们经常会看到以AFXAFX开头的宏。开头的宏。l AFXAFX小组实际上做了两件工作:小组实际上做了两件工作:MFCMFC类库和对类库和对MFCMFC的的IDEIDE支持支持( (即资源编译器和即资源编译器和操作向导操作向导) )。AFXAFX小组成员成为现在的小组成员成为现在的MFCMFC小组。小组。l

20、 MFC1.0MFC1.0于于19921992年同年同Microsoft C/C+7.0Microsoft C/C+7.0同时发布。它提供了对同时发布。它提供了对Windows APIWindows API简单的抽象和封装,还没有现在常用的文档简单的抽象和封装,还没有现在常用的文档/ /视结构,但引入了视结构,但引入了CObjectCObject,通,通过过CArchiveCArchive的持续化和其他一些的持续化和其他一些MFCMFC中仍然使用的特性,从而奠定了中仍然使用的特性,从而奠定了MFCMFC的基的基础。础。 2.1 MFC概述概述uMFCMFC是是MicrosoftMicrosof

21、t公司提供的用来编写公司提供的用来编写WindowsWindows应用程序应用程序的的C+C+类库,封装了大部分类库,封装了大部分Windows APIWindows API函数。使用函数。使用MFCMFC类库和类库和Visual C+Visual C+提供的高度可视化的应用程序开发提供的高度可视化的应用程序开发工具,可快速建立应用程序的框架。工具,可快速建立应用程序的框架。uMFC MFC 类封装了类封装了 nthe win32 API的主要结构和通用组件n应用程序对象如: documents,views and applictions nActivex,database, Internet

22、 特点uMFCMFC大约有大约有200200多个类,可以分成两种:多个类,可以分成两种:n CObject类的派生类n 非CObject类的派生类CObject 派生类派生类CObjectCCmdTargetCWinThreadCWinAppCWndCFrameWndCViewCDocumentCObject类描述了几乎所有的MFC中其他类的一些公共特性 u属性属性u方法方法u事件事件非非CObject派生类派生类u通用工具类通用工具类nCString nCTime nCTimeSpannCRectnCpointnCSizeuMFC支持类支持类 nCArchivenCDumpContextnC

23、RuntimeClassnCFileStatusnCMemoryStateuCTypePointerArrayMFC中常用的类包括:(1)线程类CWinThread:通过类程序体系结构类CCmdTarget继承CObject,表示程序的一个线程;主应用程序类CWinApp就继承于它。(2)文档模板类CDocTemplate:在SDI、MDI程序中要用到的一个很重要的类,文档模版类在一个文档模版中定义了文档类、视类和框架窗口类三者的一种关系。(3)文档类CDocument:在SDI和MDI程序重要用到的一个很重要的类,它提供文档管理。(4)窗口类CWnd:MFC中规模庞大、子类众多、成员函数最多

24、的类,封装了一个Windows窗口,它的直接子类包括:CFrameWnd(框架窗库类)、CControlBar(控件栏)、CDialog(所有对话框的公共基类)、CView(视类)及所有控件(如CBUttOm、CEdit、CTreeCtrl)等。(5)文件I/O相关类CFile和CArchive:CFile和CArchive对文件操作尤其是文件I/O提供了强大支持,ARchive可以很方便地把一种数据结构(比如一个类)存入文件或从文件读信息来重建一种数据结构。这里的“文件”是广义的,比如可以通过一个Socket连接创建一个文件,相应的管理叫CSocketFile(是CFile的子类)。MFC中

25、常用的类包括:(6)数组和链表类:数组和链表类提供了不同数据类型和链表支持,并且提供了功能强大而方便的操作。MFC链表类包括CList、CTypedPtrList、CObList、CPtrList以及CStringList,其中前两个是模板类,后三个分别是CObject、void指针和CString的链表类。MFC数组类包括CArray、CTypedPtrArray、CObArray、CByteArray、CDWordArray、CPtrArray、CStringArray、CWordArray以及CUIntArray,其中前两个是模板类。(7)图形设备接口对象类CGdiObject:它派生了

26、CBitmap(位图)、CBrush(刷子)、CFont(字体)、CPen(画笔)、CPalette(调色板)、CRgn(一个Windows图形设备接口区域)等具体的图形设备接口对象。图形设备接口即GDI(Graphics Device Interface)。CDC(设备上下文类)是与gdi关系比较密切的一个类,它派生了CClientDC、CPaintDC等常用类。(8)异常类CException:用于程序异常的捕抓和处理。(9)简单数据类型的封装:包括字符串类CString、矩形类CRect、整点类CPoint、大小尺寸类CSize、时间类CTime和相对时间跨度类CTimeSpan。(10

27、)数据库相关类:这些类提供MFC数据库支持,包括:CDatabase、CRecordSet、CDaoDatabase和CDaoRecordSet等。(11)其它:如图像列表类CImageList、菜单类CMenu、Socket类CSocket和CAsyncSocket等。Simple Value Types类名类名基类基类base classCPointPOINTstruct tagPOINT#include 数据成员共有数据成员共有CSizeSIZEstruct tagSIZECRectRECTstruct tagRECTCString无无#include CTimeCTimeSpan(9)

28、简单数据类型的封装:包括字符串类简单数据类型的封装:包括字符串类CString、矩形类、矩形类CRect、整点类、整点类CPoint、大小尺寸类大小尺寸类CSize、时间类、时间类CTime和相对和相对时间跨度类时间跨度类CTimeSpan。(不是从不是从CObject类派生的类派生的)数组类数组类 链表类链表类 (6)从从CObject派生出的数组和链表类提供了不同数据类型和派生出的数组和链表类提供了不同数据类型和链表支持,并且提供了功能强大而方便的操作。链表支持,并且提供了功能强大而方便的操作。MFC链表类包括链表类包括CList、CTypedPtrList、CObList、CPtrLis

29、t以及以及CStringList,其中前两个是模板类,后三个分其中前两个是模板类,后三个分别是别是CObject、void指针和指针和CString的链表类。的链表类。MFC数组类包括数组类包括CArray、CTypedPtrArray、CObArray、CByteArray、CDWordArray、CPtrArray、CStringArray、CWordArray以及以及CUIntArray,其中前两个是模板类。其中前两个是模板类。CString类类u重载了大量运算符重载了大量运算符u其成员函数其成员函数Formatvoid Format( LPCTSTR lpszFormat, . );l

30、pszFormat:A format-control string.Call this member function to write formatted data to a CString in the same way that sprintf formats data into a C-style character array. This function formats and stores a series of characters and values in the CString. Each optional argument (if any) is converted a

31、nd output according to the corresponding format specification in lpszFormat. n%dint%fdoublen%schar %cchar例:例: m_exp.Format(%d+%d=,n1,n2);2.2 使用使用MFC创建创建Windows应用程序应用程序uMFC编写的应用程序也是从编写的应用程序也是从WinMain()函数开始运行,函数开始运行,但但WinMain()函数封装在函数封装在MFC框架中框架中,不可见。不可见。uMFC将将Windows应用程序从开始运行、消息传递到结应用程序从开始运行、消息传递到结束运

32、行所需的各步骤均封装在束运行所需的各步骤均封装在CWinApp类中,类中, CWinApp类表示类表示MFC应用程序的应用对象。应用程序的应用对象。u一个一个MFC应用程序必须有且只能有一个从应用程序必须有且只能有一个从CWinApp类派生的全局应用程序对象,此对象在运行时刻控制类派生的全局应用程序对象,此对象在运行时刻控制应用程序中所有其他对象的活动。该对象在创建时应用程序中所有其他对象的活动。该对象在创建时,自自动调用动调用WinMain()函数函数.u两种方法两种方法n不使用向导:非可视化n使用应用程序向导AppWizard :可视化#includeclass CMyApp:public

33、 CWinApppublic:virtual BOOL InitInstance();CMyApp m;class CMyWnd: public CFrameWndCStatic *a;public:CMyWnd();BOOL CMyApp:InitInstance ()m_pMainWnd=new CMyWnd();m_pMainWnd-ShowWindow (m_nCmdShow);m_pMainWnd-UpdateWindow ();return true;CMyWnd:CMyWnd() Create(NULL,My Win32App,WS_OVERLAPPEDWINDOW,CRect(

34、10,10,200,200); a=new CStatic(); a-Create(Hello,WS_CHILD|WS_VISIBLE,CRect(10,10,50,50),this);应用程序类窗口类书P1162.3 使用使用MFC AppWizard创建基于对话框的应用程序创建基于对话框的应用程序 u在在Visual C+Visual C+中使用中使用MFCMFC可创建三种类典型的可创建三种类典型的WindowsWindows应用程序:应用程序:n基于对话框的应用程序(Dialog based)n单文档(SDI)应用程序(Single Document)n多文档(MDI)应用程序(Mult

35、iple Documentsu对话框(对话框(DialogDialog)是是WindowsWindows环境下计算机与用户之间进行数据环境下计算机与用户之间进行数据交互的重要手段。所谓基于对话框的应用程序,就是该程序运交互的重要手段。所谓基于对话框的应用程序,就是该程序运行时其主界面是一个对话框,用户通过这个对话框同应用程序行时其主界面是一个对话框,用户通过这个对话框同应用程序进行交互:用户通过该对话框向应用程序提供数据,应用程序进行交互:用户通过该对话框向应用程序提供数据,应用程序根据用户提供的数据进行处理,再由对话框将结果显示给用户。根据用户提供的数据进行处理,再由对话框将结果显示给用户。

36、u实现程序交互功能的对话框要接受各种消息驱动,因此在对话实现程序交互功能的对话框要接受各种消息驱动,因此在对话框中还应该包括各种类型的控制对象,例如静态文本、文本编框中还应该包括各种类型的控制对象,例如静态文本、文本编辑框和命令按钮等,这些对象被称为辑框和命令按钮等,这些对象被称为控件(控件(ControlsControls)。 对话框对话框对话框分为模式对话框和非模式对话框两类。对话框分为模式对话框和非模式对话框两类。u模式对话框启动后垄断了用户的输入,当一个模模式对话框启动后垄断了用户的输入,当一个模式对话框被打开时,用户只能与该对话框进行交式对话框被打开时,用户只能与该对话框进行交互,而

37、其它用户界面对象不能接受用户的信息,互,而其它用户界面对象不能接受用户的信息,直至关闭该模式对话框。直至关闭该模式对话框。u非模式对话框类似普通的非模式对话框类似普通的Windows窗口,比如资窗口,比如资源编辑器窗口,并不垄断用户的输入。当非模式源编辑器窗口,并不垄断用户的输入。当非模式对话框打开时,用户可以同时打开其它窗口对象对话框打开时,用户可以同时打开其它窗口对象进行操作,操作完毕后,再用鼠标或其它方式激进行操作,操作完毕后,再用鼠标或其它方式激活该对话框继续进行操作。活该对话框继续进行操作。MFC AppWizard创建基于对话框的创建基于对话框的Windows应用程序应用程序 u1

38、、MFC AppWizard(exe) :使用:使用AppWizard向导创向导创建基于对话框的建基于对话框的Windows应用程序应用程序n基于对话框应用程序的初始界面基于对话框应用程序的初始界面n基于对话框应用程序中的类、文件和资源基于对话框应用程序中的类、文件和资源u2、编辑、编辑对话框资源对话框资源:可视化编辑:可视化编辑n在资源编辑器中打开对话框在资源编辑器中打开对话框n设置对话框属性设置对话框属性n编辑控件:添加、布局、编辑控件:添加、布局、Tab序号序号u3、使用、使用ClassWizard编辑编辑对话框类对话框类:实现功能:实现功能n为控件生成其对应的成员变量为控件生成其对应的

39、成员变量n建立消息映射及其函数并添加代码建立消息映射及其函数并添加代码n对话框的初始化对话框的初始化1、AppWizard创建基于对话框的创建基于对话框的Windows应用程序应用程序u例例1:显示一行文本的对话框:显示一行文本的对话框u由由AppWizard创建后,生成了三个类创建后,生成了三个类:n应用程序类(CWinApp的派生类)n对话框类(CDialog的派生类)n版权信息对话框类(CAboutDlg)u例例2:输入两个整数求它们的和。:输入两个整数求它们的和。创建后先链接,再进行其它操作创建后先链接,再进行其它操作应用程序类应用程序类u每个应用程序必须从每个应用程序必须从CWinA

40、ppCWinApp派生出自己的应用程序类,并定义派生出自己的应用程序类,并定义了一个全局对象了一个全局对象(theApp(theApp) ),该应用程序类封装了包括初始化、,该应用程序类封装了包括初始化、运行和结束的整个过程。运行和结束的整个过程。u应用程序类应用程序类包括:包括:n类定义头文件类定义头文件(.h):(.h):一个空的类结构一个空的类结构n类的实现文件类的实现文件(.cpp(.cpp) ) 应用程序类的消息映射应用程序类的消息映射 空的构造函数空的构造函数 全局对象全局对象theApptheApp InitInstanceInitInstance函数定义函数定义u 应用程序类名

41、是应用程序类名是AppWizardAppWizard根据工程名称自动命名的,存在以下三条规则:根据工程名称自动命名的,存在以下三条规则:n 如果工程名符合标识符的命名规则,则应用程序类名由字母如果工程名符合标识符的命名规则,则应用程序类名由字母C C、工程名、工程名和和AppApp三部分组成。如工程名为三部分组成。如工程名为testtest,则应用程序类名为:,则应用程序类名为:CTestAppCTestApp。n 若工程名以数字开始,则应用程序类名由字母若工程名以数字开始,则应用程序类名由字母CMyCMy、工程名和、工程名和AppApp三部分三部分组成。例如:工程名为组成。例如:工程名为te

42、sttest,则应用程序类名为:,则应用程序类名为:CMyTestAppCMyTestApp。n 忽略工程名的汉字。忽略工程名的汉字。2、使用资源编辑器设计对话框资源实现界面设计、使用资源编辑器设计对话框资源实现界面设计u创建对话框、设置属性创建对话框、设置属性u增加增加/删除控件删除控件u设置控件属性设置控件属性:决定了一个控件的可操作行为和显示决定了一个控件的可操作行为和显示效果效果,Propertiesu组织和排列控件组织和排列控件: Layout菜单菜单nAlign对齐:以选定的最后一个控件为标准nMake Same Size:以选定的最后一个控件为标准u焦点顺序,焦点顺序,Tab序号

43、序号u测试对话框测试对话框: 测试运行效果测试运行效果. Layout菜单菜单-Test命令命令界面设计界面设计CDialog类在MFC类库中的层次位置对话框类对话框类u对话框实际上也是一对话框实际上也是一个窗口,在个窗口,在MFC中,中,对话框的功能封装在对话框的功能封装在CDialog类中,它是类中,它是CWnd类的派生类。类的派生类。u在在Windows应用程序中,对话框是一种资源应用程序中,对话框是一种资源(Resource),可在),可在Visual C+的资源编辑器中进的资源编辑器中进行可视化编辑。行可视化编辑。界面设计界面设计u要在程序中使用对话框,还要为每个对话框从要在程序中使

44、用对话框,还要为每个对话框从CDialog类派生出其对应的类,在类的操作下才能以类派生出其对应的类,在类的操作下才能以对话框为界面与用户交互。对话框为界面与用户交互。实现交互功能实现交互功能3、设计对话框类实现功能、设计对话框类实现功能u为控件生成其对应的成员变量:为控件生成其对应的成员变量:把成员变量与控把成员变量与控件关联起来,从而可在程序中实现对控件的操作。件关联起来,从而可在程序中实现对控件的操作。MFC提供两种类型的成员变量提供两种类型的成员变量nValues值类型的成员变量,实现应用程序与用户的交互。可有多种数据类型供选择,由所关联的控件类型决定,如Edit Box控件可以有CSt

45、ring、int和double等。通过UpdateData()实现界面上的控件与对应成员变量的数据传递。nControls控件类型,创建该控件所对应的控件类的一个对象,从而可调用其成员函数/方法实现控制,如获得焦点等u建立消息映射及其函数并添加代码建立消息映射及其函数并添加代码u对话框的关闭对话框的关闭功能功能(3-1) 为控件添加其对应为控件添加其对应/关联的成员变量关联的成员变量u使用使用Class Wizardu手工添加:将代码添加到相应的文件中手工添加:将代码添加到相应的文件中u在对话框类的定义在对话框类的定义( (头文件头文件) )中中, ,增加了增加了成员变量的声明成员变量的声明(

46、 (注意:浅灰色代码表示是ClassWizard创建的.尽量不要在文件中直接修改,而使用ClassWizard进行修改,否则容易出错)u在对话框类的构造函数中在对话框类的构造函数中(.cpp(.cpp文件文件),),自动加入了成员变量的初始化代码。自动加入了成员变量的初始化代码。使用使用Class Wizard添加成员变量后其完成的工作添加成员变量后其完成的工作/ Dialog Data/AFX_DATA(CTest3Dlg)enum IDD = IDD_TEST3_DIALOG ;doublem_a; doublem_b;doublem_c;/AFX_DATA/AFX_DATA_INIT(C

47、Test3Dlg)m_a = 0.0;m_b = 0.0;m_c = 0.0;/AFX_DATA_INITvoid CTest3Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CTest3Dlg)DDX_Text(pDX, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);DDX_Text(pDX, IDC_EDIT3, m_c);/AFX_DATA_MAPu在对话框类的实现文件中(.cpp)的DoDataExchange函数中,增加了/AF

48、X_DATA_MAP(CAbcDlg/AFX_DATA_MAP(CAbcDlg) )DDX_Text(pDXDDX_Text(pDX, IDC_EDIT1, m_a); /, IDC_EDIT1, m_a); /文本框控件数据交换文本框控件数据交换DDV_MinMaxDouble(pDXDDV_MinMaxDouble(pDX, m_a, 0., 100.); /, m_a, 0., 100.); /最大最小值检查最大最小值检查/AFX_DATA_MAP/AFX_DATA_MAP添加控件关联的成员变量:相应文件中添加的代码添加控件关联的成员变量:相应文件中添加的代码1、在类定义的、在类定义的.

49、 h头文件中的头文件中的/AFX_DATA之间添加成员变之间添加成员变量的声明量的声明2、在类实现的源文件、在类实现的源文件.cpp的构造的构造函数中的函数中的/AFX_DATA_INIT之间为其初始化之间为其初始化3、在类实现的源文件、在类实现的源文件.cpp的的DoDataExchange()函数中的函数中的/AFX_DATA_MAP之间添加之间添加控件与成员变量控件与成员变量 的关联关系的关联关系DDX_Text(pDX, 控件的控件的ID,对应的成员变量对应的成员变量);/ Values值类型值类型DDX_Control(pDX, 控件的控件的ID,对应的成员变量对应的成员变量); /

50、Controls控件类型控件类型/ Dialog Data/AFX_DATA(CTest3Dlg)enum IDD = IDD_TEST3_DIALOG ;doublem_a; doublem_b;doublem_c;/AFX_DATA/AFX_DATA_INIT(CTest3Dlg)m_a = 0.0;m_b = 0.0;m_c = 0.0;/AFX_DATA_INITvoid CTest3Dlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CTest3Dlg)DDX_Text(pDX

51、, IDC_EDIT1, m_a);DDX_Text(pDX, IDC_EDIT2, m_b);DDX_Text(pDX, IDC_EDIT3, m_c);/AFX_DATA_MAP对话框数据交换和校验对话框数据交换和校验(DDX和和DDV)u对话框的值类型的成员变量存储了与控件相对应的数据对话框的值类型的成员变量存储了与控件相对应的数据,用户可修改控件的数据用户可修改控件的数据,此时此时,数据成员变量需要与控件进数据成员变量需要与控件进行数据交换行数据交换,完成输入输出功能完成输入输出功能.uMFC是靠是靠CDataExchange类提供的数据交换类提供的数据交换(DDX, Dialog D

52、ata Exchange)机制来完成的机制来完成的,该类还提供了数据该类还提供了数据有效性验证机制有效性验证机制DDV (Dialog Data Validation)(如设置最如设置最大最小值大最小值).u对话框类调用对话框类调用DoDataExchange函数来实现函数来实现DDV和和DDX.u当程序需要交换数据时当程序需要交换数据时,不需要编写代码调用不需要编写代码调用DoDataExchange函数函数,而是调用而是调用CWnd:UpdateData函函数数,该函数内部调用了该函数内部调用了DoDataExchange函数函数.uUpdateData函数只有一个函数只有一个BOOL类型

53、的参数类型的参数(true,false),分别表示数据交换的不同方向分别表示数据交换的不同方向:该控件的成员变量UpdateData(true);UpdateData(false);该控件的成员变量utrue :表示将控件中显示的值复制到成员变量表示将控件中显示的值复制到成员变量;ufalse:表示将成员变量的值复制控件中显示出来表示将成员变量的值复制控件中显示出来.uUpdateData(false);/将对话框对象的数据成员值传送到控件将对话框对象的数据成员值传送到控件uUpdateData(true); /将控件中的值传送到对话框对象相应的数将控件中的值传送到对话框对象相应的数据成员据成

54、员u消息映射是利用消息映射是利用MFCMFC编写的编写的WindowsWindows程序的一部分,就是让程程序的一部分,就是让程序员指定要某个有消息处理能力的序员指定要某个有消息处理能力的MFCMFC类处理某个消息。通过类处理某个消息。通过消息映射,消息和它的处理函数才能对应起来。消息映射,消息和它的处理函数才能对应起来。u在类中增加消息映射,等于声明了在类中增加消息映射,等于声明了“我将要处理这类消息我将要处理这类消息”,程序框架就会将该类消息发送出去。程序框架就会将该类消息发送出去。u消息映射存在于两部分中:一个是类的头文件;另一个是相消息映射存在于两部分中:一个是类的头文件;另一个是相关

55、的关的.cpp.cpp文件。文件。uMFCMFC的类捕获了绝大多数的普通消息并予以恰当的处理,不需的类捕获了绝大多数的普通消息并予以恰当的处理,不需要程序员再写任何代码,程序员只需要在应用程序中添加要要程序员再写任何代码,程序员只需要在应用程序中添加要处理特殊消息的映射条目即可处理特殊消息的映射条目即可. .u两种方法两种方法n使用Class Wizardn手工添加:将代码添加到相应的文件中(3-2) 建立消息映射及其函数并添加代码建立消息映射及其函数并添加代码添加消息映射成员函数:相应文件中添加的代码添加消息映射成员函数:相应文件中添加的代码1、在定义对话框类的、在定义对话框类的. h头文件

56、中的头文件中的/AFX_MSG之间添加消息映之间添加消息映射成员函数的声明射成员函数的声明2、在对话框类实现的、在对话框类实现的.cpp源文件中的消息映射序列中为消息添加源文件中的消息映射序列中为消息添加消息映射函数宏消息映射函数宏注:无分号注:无分号3、在对话框类实现的、在对话框类实现的.cpp源文件中添加该消息映射成员函数的定源文件中添加该消息映射成员函数的定义并输入代码义并输入代码void CTest3Dlg:OnAdd() / Generated message map functions/AFX_MSG(CTest3Dlg)virtual BOOL OnInitDialog();af

57、x_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnAdd();/AFX_MSGDECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(CTest3Dlg, CDialog)/AFX_MSG_MAP(CTest3Dlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnAdd

58、)/AFX_MSG_MAPEND_MESSAGE_MAP()MFC消息映射原理消息映射原理uMFC 应用程序的消息处理机制与Win32应用程序有很大不同,它使用基本类的消息映射表代替了Win32的窗口函数WndProc()中的switch-case结构,使消息映射系统的结构更为简洁明了,同时消息的处理路径却更为隐蔽。uMFC应用程序的消息循环由应用程序类的成员函数Run()函数来完成的。Run() 函数调用成员函数GetMessage(), TranslateMEssage()和 DispatchMessage()维护一个消息循环。经过一系列的处理,最后将接收到的消息都交给主窗口类的窗口函数O

59、nWndMsg(),由OnWndMsg()函数负责将消息分类并交予不同的消息处理函数去处理。uMFC 消息映射的原理:在每个能接受和处理消息的类中,定消息映射的原理:在每个能接受和处理消息的类中,定义了一个消息及其处理函数的静态对照表,称为义了一个消息及其处理函数的静态对照表,称为消息映射表消息映射表。程序通过检索消息映射表,就可以判断该类是否能处理此消息,程序通过检索消息映射表,就可以判断该类是否能处理此消息,迅速找到并调用相应的消息处理函数迅速找到并调用相应的消息处理函数消息映射表消息映射表uMFCMFC在每一个能够接收和处理消息类中,定义一个消息和消息在每一个能够接收和处理消息类中,定义

60、一个消息和消息处理函数静态对照表,该表称为消息映射表。该类能够处理的处理函数静态对照表,该表称为消息映射表。该类能够处理的所有的消息及其对应的消息处理函数的地址都列在该表中。所有的消息及其对应的消息处理函数的地址都列在该表中。uMFCMFC提供了提供了3 3个宏来管理消息映射个宏来管理消息映射: :nDECLARE_MESSAGE_MAP( )DECLARE_MESSAGE_MAP( ):在类的定义在类的定义(.h)(.h)中,用于声明一个消息映射表的结构。中,用于声明一个消息映射表的结构。nBEGIN_MESSAGE_MAP( ) BEGIN_MESSAGE_MAP( ) nEND_MESS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论