友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第29章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!





//  



#include 〃stdafx。h〃  



#include 〃DialogDemo。h〃  



#include 〃DialogDemoDlg。h〃  



#ifdef _DEBUG  



#define new DEBUG_NEW  



#undef THIS_FILE  



static char THIS_FILE'' = __FILE__;  



#endif  



/////////////////////////////////////////////////////////////////////////////  



// CDialogDemoApp  



BEGIN_MESSAGE_MAP(CDialogDemoApp; CWinApp)  



//{{AFX_MSG_MAP(CDialogDemoApp)  



// 注意 ClassWizard 将在此添加或删除映射宏。  



// 不要删除你在这里看到的这些生成代码块 !  


…………………………………………………………Page 175……………………………………………………………

//}}AFX_MSG  



ON_MAND(ID_HELP; CWinApp::OnHelp)  



END_MESSAGE_MAP()  



/////////////////////////////////////////////////////////////////////////////  



// CDialogDemoApp 构造  



CDialogDemoApp::CDialogDemoApp()  



{  



// TODO: 在这里添加构造代码,  



// 将所有重要的初始化放入 InitInstance  



}  



/////////////////////////////////////////////////////////////////////////////  



// 唯一的 CDialogDemoApp 对象  



CDialogDemoApp theApp;  



/////////////////////////////////////////////////////////////////////////////  



// CDialogDemoApp 初始化  



BOOL CDialogDemoApp::InitInstance()  



{  



AfxEnableControlContainer();  



// 标准初始化  



// 如果你不需要使用这些特性,并且希望减小最终可执行文件的大小,你可以删除  



// 下面的特定的初始化过程中不需要的部分。  



#ifdef _AFXDLL  



Enable3dControls(); // 当通过共享 DLL 使用 MFC 时调用  



#else  



Enable3dControlsStatic(); // 当通过静态链接到 MFC 时调用  



#endif  


…………………………………………………………Page 176……………………………………………………………

CDialogDemoDlg dlg;  



m_pMainWnd = &dlg;  



int nResponse = dlg。DoModal();  



if (nResponse == IDOK)  



{  



// TODO: 在这里添加当使用 OK 关闭对话框时的处理代码  



}  



else if (nResponse == IDCANCEL)  



{  



// TODO: 在这里添加当使用 Cancel 关闭对话框时的处理代码  



}  



// 由于对话框已被关闭,返回 FALSE 并退出应用程序,而不需要启动应用程序  



// 消息泵。  



return FALSE;  



}  



上面的源代码为类CDialogDemoApp提供了一个空的构造函数和一个对 

InitInstance的默认重载。我们把讨论的重点放在InitInstance成员 

函数上。在InitInstance成员函数的一开始,先调用MFC全局函数 

AfxEnableControlContainer,该函数为应用程序提供了对OLE控件 

(新的术语称作ActiveX控件)的支持。  



接着,InitInstance成员函数调用类CWinApp的成员函数 

Enable3dControls或Enable3dControlsStatic以允许对话框和窗口可 

以使用具有三维外观的控件。这两个成员函数加载CTL3D32。DLL并且 

注册应用程序。Enable3dControls和Enable3dControlsStatic的区别 

在于一个在链接到MFC动态链接库时使用,而另一个在使用MFC的静态 

链接时使用。  



MFC 自动为以下窗口类提供3D控件效果:  



   l CDialog  



   l CDialogBar  


…………………………………………………………Page 177……………………………………………………………

  l CFormView  



  l CPropertyPage  



  l CPropertySheet  



  l CControlBar  



  l CToolBar  



如果你所希望得到3D效果的控件属于以上类型之一的话,你只需调用 

Enable3dControls或Enable3dControlsStatic即可。反之则必须直接 

调用相应的CTL3D32 API函数。  



然后在InitInstance中定义了类型为CDialogDemoDlg的对象dlg,然 

后将其指针赋予类型为CWnd的成员变量m_pMainWnd。成员变量 

m_pMainWnd用来保存指向线程主窗口对象的指针,当由m_pMainWnd引 

用的窗口被关闭时,该线程由MFC 自动终止。当应用程序的主线程被 

终止时,该应用程序相应的也被终止。如果该成员的值为NULL,则应 

用程序的CWinApp对象的主窗口被用来判断线程何时终止。成员 

m_pMainWnd具有共有访问权限。对于工作者线程而言,该数据成员的 

值从其父线程继承。  



接着InitInstance调用了对象dlg的成员函数DoModal,该成员函数以 

模态方式调用对话框并在结束时返回对话框的结果。在对话框激活 

时,该成员函数处理所有与用户的交互,也就是说,对于模态对话 

框,用户不可以在对话框关闭之前与其它窗口进行交互。  



如果用户单击了对话框中的OK或Cancel按钮,相应的消息处理函数, 

如OnOK或OnCancel被调用以试图关闭对话框。OnOK成员函数的默认行 

为为验证和更新对话框数据并以结果IDOK关闭对话框,OnCancel的默 

认行为为以结果IDCANCEL关闭对话框并不更机关报所有对话框数据。 

通过重载这些消息处理函数可以改变它们的行为。  



在DoModal返回时,对话框将被关闭,理所当然的,基于该对话框的 

应用程序也应该被关闭,因此在InitInstance的最后使用了语句  



return FALSE;  



            第三节 MFC应用程序的消息循环  



上面的对应用程序的类的定义和声明还包括了MFC的消息循环 


…………………………………………………………Page 178……………………………………………………………

(message   loop),下面我们来详细的描述MFC应用程序的消息循环。 

框架应用程序处理Windows消息的方式同其它Windows应用程序是类似 

的,只不过它提供了一些方法来使得这个过程更加的方便,更加的易 

于维护和更好的包装。  



  l 注意:  



  l 为便于读者理解,在此我们给出一个MFC对对话框控制的支持的树 

   图(如图4。8所示)。  



在类CWinApp的Run成员函数中的消息循环获取各种事件所产生的排队 

消息(queued  message),应用程序消息循环的框架实现是将它们分发 

到合适的窗口。  



在MFC中,每一个单独的消息都由一个专门的函数进行处理,这种称 

作消息处理函数 (message…handler  function或message  handler或 

handler)的专门函数以类的成员函数的方式进行定义。处理命令消息 

的函数还常被称作命令处理函数 (mand handler)。  



Windows应用程序是消息驱动的,因此编写消息处理函数就成了编写 

框架应用程序的工作中的一个很大的组成部分。  



                               



             图4。 8 MFC 中对话框控件类的树状结构图  



每一个有能力获取消息或命令的框架类都有它自己的消息映射 

(message   map),框架使用消息映射来建立消息和命令到它们的处理 

函数之间的链接。所有从类CCmdTarget派生的类都可以有它自己的消 

息映射。尽管我们常常区别消息和命令两个术语,但这里所说的消息 


…………………………………………………………Page 179……………………………………………………………

映射同时对它们进行处理。  



下面我们来看一下消息是如何发送和获取的。  



很多消息来自于用户和程序之间的交互:当用户使用鼠标单击了菜单 

项或工具条按钮或按下了快捷键时,即产生了命令。同样由用户产生 

的Windows消息还可以来 自移动窗口或改变窗口的大小。此外,当程 

序启动或终止、窗口获得或失去焦点等等事件发生时,相应的 

Windows消息也将被发送。控件作为一种特殊形式的窗口,相应的控 

件通知消息也在类似的情形下产生。  



Run成员函数用来获取消息并将它们发送到合适的窗口,很多的命令 

消息被发送到应用程序的主窗口,由类库预先定义的WindowProc函数 

获得这些消息,然后根据所获得的消息的类型来以不同的方式对它们 

进行处理。  



最初接受消息的必须是一个窗口对象。Windows消息通常直接由该窗 

口对象进行处理。而命令消息一般由应用程序的主框架窗口开始,按 

照命令路径描述的命令目标链进行处理。  



当一个命令目标链获得消息或命令时,它将搜索它的消息映射以寻找 

匹配项。如果该消息的一个处理函数存在,该处理函数将被调用。  



与命令不同,对于标准Windows消息,它们并不经过命令目标链,通 

常由该消息的目标窗口进行处理,这个 目标窗口可能是主框架窗口, 

也可能是一个MDI子窗口、一个标准控件、对话框、视或其它形式的 

子窗口。  



在运行时,每一个Windows窗口都与一个窗口对象建立关联,该窗口 

对象由直接的或间接的由类CWnd派生,并且有着它自己的消息映射和 

处理函数。框架使用这个消息映射来将到来的消息映射到它们的处理 

函数。  



对于命令,我们所需做的只是建立命令到它们的处理函数之间的链 

接,通常使用ClassWizard来完成这一步工作,然后编写绝大多数的 

命令处理程序。  



Windows消息通常发送到主框架窗口,但是命令消息将可能传送到其 

它的对象,框架通过一个命令目标对象的标准顺序来传递命令,这些 

命令目标对象至少有一个可能 (并不是一定)包含该命令的处理函数。 

每一个命令目标对象检查它的消息映射以查看是否有一个命令处理函 

数来处理到来的消息。  


…………………………………………………………Page 180……………………………………………………………

不同的命令目标类在不同的时候检查它们 自己的消息映射。典型的, 

一个类将命令传送给其它一些类,这使得这些类具有最先处理该消息 

的机会。如果这些类中没有一个处理了该命令,最初的那个类将检查 

它的消息映射,然后,如果它也没有提供相应的处理函数,它可能会 

将该命令传送给更多的命令目标。表4。2描述了构成这一顺序的结 

构。通常的顺序是先传送给当前激活子命令目标对象,再传送给自 

身,最后传送给其它的命令目标。  



                    表4。 2 标准命令传送路径  

返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!