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

VC语言6.0程序设计从入门到精通-第16章

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




读者是可能第一次接触到  MFC  编程,因此首先对工程及工作区的概念及创建方法进行了介 

绍。在此基础上通过 AppWizard  工具一步步地创建出的基于单文档(SDI )的 HelloMFC  应 

用程序,并对其工程文件的组成及作用进行了说明。针对 HelloMFC 应用程序,介绍了类向 

导(ClassWizard )工具的基本用法,接着对程序的运行过程以及应用类(CWinApp )的几个 

主要的成员函数进行了解释。由于 HelloMFC  是基于文档视图结构的,接下来对该结构的文 

档类和视图类的各自作用及相互之间的关系分别进行了说明,同时对经常用到的单文档 

 SDI)和多文档(MDI )结构进行了对比。针对框架结构中不可缺少主窗口类(CMainFrame ) 

( 

和子窗口类(CChildFrame ),本章也对它们的功能和使用方法进行了介绍,同时介绍了在框 

架窗口使用频率很高的工具栏(Toolbar )和状态栏(StatusBar)也介绍了创建过程和使用方 

法,电子时钟(在状态栏中创建一个电子时钟 )例程演示了自定义状态栏的使用方法。最后, 

对应用程序框架中的主要对象的关系及相互访问情况进行了总结。  

   本章阐述的应用程序框架是对话框、控件、文件操作及 Visual  C++高级编程的基础,希 

望读者能够仔细阅读推敲,并在后面章节的学习过程中能够反复翻阅体会,以便达到对 MFC 

应用程序框架的深刻理解。  



                                                           ·41 ·  


…………………………………………………………Page 51……………………………………………………………

            第 3 章    菜单与加速键  

            第 3 章    菜单与加速键  



   菜单是 Windows 程序界面的重要元素,程序的各种操作和功能都是通过单击菜单项完成 

的。一个设计合理、功能完善的菜单能极大地方便用户的使用。加速键是菜单的辅助功能, 

程序使用者可以通过快捷键直接访问常用的菜单选项。本章就介绍在程序中创建菜单和加速 

键的方法。  



3。1    消息与事件  



   Windows 应用程序是通过消息驱动的,因此消息和事件是Windows 程序设计的核心概念。 

本节将简要介绍消息和事件的处理过程,为以后的编程实践打下基础。  



3。1。1    事件驱动机制  



   在生活中,人们都会对外界发生的各种各样的和自身相关的刺激做出一定的反应,这就 

是所谓的应激性。Windows 系统中也有类似的应激性,也就是本小节要介绍的概念—事件 

驱动机制。  

   Windows 作为一个以图形界面为主的操作系统,主要面向与用户的交互。这个特点决定 

了在 Windows 上面运行的程序大部分都要以等待用户输入,并根据用户输入做出相应的操作 

为主要运行方式 。因此,用户输入是 Windows 系统中消息和事件的一个主要来源。根据用户 

输入做出相应的操作,这个过程称为消息处理的过程。同时 Windows 系统也将系统和程序, 

程序和程序之间的相互作用,抽象为另外一类消息和事件。这样程序在运行中与系统环境的 

相互作用就体现为接收消息,然后对消息进行处理。这就是事件驱动机制的主要内涵。  

   Windows 下的应用程序的主要工作是进行消息的循环处理,通过循环等待消息的到来和 

事件的发生,然后对不同的消息和事件运行相关的代码,完成相应的操作。  



3。1。2    消息和消息映射  



   Windows 系统中的程序大部分都是通过消息和事件驱动的。为了完成各种功能,Windows 

提供了大量的消息。这些消息主要有 3 种类型。  

   o  标准 Windows 消息:消息名以 WM_ 为前缀的消息(也有例外,如控件通知消息 

    WM_MAND ),例如  WM_SIZE (改变窗口大小消息)、WM_MOVE (移动窗口 

    消息)等。  

   o  控件通知消息:由列表框、按钮等控件或子窗口发给其父窗口的通知消息 ,以 

    WM_MAND 为消息名,消息中包含有控件通知代码,用以区分不同的控件通知 


…………………………………………………………Page 52……………………………………………………………

                                                                                  第 3 章    菜单与加速键  



        消息。  

     o  命令消息:命令消息也以 WM_MAND 为消息名,在消息中包含有命令的标识符, 

        用以区分不同的命令。命令消息主要来自菜单、工具栏和加速键。其中菜单和加速键 

        消息将是本章要学习的内容。  

     上面的这 3 类消息在 MFC  中有统一的处理框架,即消息映射机制。消息映射机制将消 

息及其处理函数表示成一一对应的表,并对这张表进行分析处理。 

                                                                           CCmdTarget 类的派生类用 

于存放消息映射机制,使用消息映射必须在源程序中加入以下两方面内容:  

     (1)在类的头文件中加入如下语句:  



     DECLARE_MESSAGE_MAP()  



     例如在类 CTestApp 的头文件 TestApp。h 中有如下代码段:  



     class CTestApp : public CWinApp  



     {  



     public:  



          CTestApp();  



       



     // Overrides  



          // ClassWizard generated virtual function overrides  



          //{{AFX_VIRTUAL(CTestApp)  



          public:  



          virtual BOOL InitInstance();  



          //}}AFX_VIRTUAL  



       



     // Implementation  



          //{{AFX_MSG(CTestApp)  



          afx_msg void OnAppAbout();  



                // NOTE the ClassWizard will add and remove member functions here。  



                // DO NOT EDIT what you see in these blocks of generated code !  



          //}}AFX_MSG  



          DECLARE_MESSAGE_MAP()  



     };  



     DECLARE_MESSAGE_MAP()就添加在 CTestApp 类的定义程序块的末尾。  

     (2 )在类的实现文件中加入消息映射表:  



     BEGIN_MESSAGE_MAP(类名;  父类名)    



           ……  



           消息映射表项  



           ……  



     END_MESSAGE_MAP()  



     在 CTestApp 类的实现文件 TestApp。cpp 的开头、常量定义的后面,就有如下消息映射表 

的代码:  



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



                                                                                                   ·43 ·  


…………………………………………………………Page 53……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通      



    // CTestApp  



      



    BEGIN_MESSAGE_MAP(CTestApp; CWinApp)  



        //{{AFX_MSG_MAP(CTestApp)  



        ON_MAND(ID_APP_ABOUT; OnAppAbout)  



            // NOTE the ClassWizard will add and remove mapping macros here。  



            //        DO NOT EDIT what you see in these blocks of generated code!  



        //}}AFX_MSG_MAP  



        // Standard file based document mands  



        ON_MAND(ID_FILE_NEW; CWinApp::OnFileNew)  



        ON_MAND(ID_FILE_OPEN; CWinApp::OnFileOpen)  



        // Standard print setup mand  



        ON_MAND(ID_FILE_PRINT_SETUP; CWinApp::OnFilePrintSetup)  



    END_MESSAGE_MAP()  



    MFC AppWizard 生成的应用程都已经自动包含消息映射的代码,但用户也可以在源程序 

中手动添加。同时 Visual C++另一个强大的工具 ClassWizard 也提供了处理消息映射表的自动 

化机制。当然,ClassWizard 只能够生成类和消息处理的框架,包括创建消息处理函数的声明, 

而具体的实现代码还需要用户去补充。  

    在类中,消息处理函数都是类的成员函数 。当程序要对一个消息进行响应时,消息映射 

机制就会自动调用该函数。用 ClassWizard  添加消息处理函数时,会自动添加以下 3 部分内 

容:  

    o  在类的定义中添加该消息处理成员函数的函数声明;  

    o  在类的消息映射表中加入相应的消息映射表项;  

    o  在类的实现中加入该消息处理成员函数的函数实现。  

    注意  ClassWizard  添加的函数实现中,只是一个不能完成任何操作的空函数框架,还需 

要加入具体的实现代码。但当用户手动添加消息处理函数时,也必须添加上述 3 部分内容。  

    对于标准 Windows 消息,在 CWnd 类中已经预定义了默认的处理函数,有确定的函数名, 

一般以    On  开头,以消息名为函数名的后半部分,例如                      WM_PAINT    消息的处理函数为 

OnPaint(),WM_CREATE 消息处理函数是 OnCreate() 。这些预定义的消息处理函数根据消息 

的不同有不同的参数和返回值。  

    对于控件通知消息和命令消息,一般没有默认的消息处理函数,可以由用户自定义。MFC 

建议这类函数命名应遵循一些约定,一般以 On  开头,函数名中应包含该消息的简要说明, 

              ClassWizard 在创建这类消息处理函数时会提供一个建议的函数名,一般无需 

方便阅读代码。 

修改。例如 OnFileOpen()函数表明处理命令标识符 ID_FILE_OPEN 的命令消息。  

    本章和以后的章节都将主要利用  ClassWizard  为程序添加消息处理函数。因此下面简要 

介绍一下 ClassWizard 对话框,如图 3…1 所示。在 IDE 主菜单栏中选择“View|ClassWizard ” 

菜单命令,或者在开发环境的界面中直接按快捷键 Ctrl+W,即可打开“MFC  ClassWizard ” 

对话框。选择“Message Maps ”的选项卡,即可进行编辑消息映射的设置。  



 ·44 ·  


…………………………………………………………Page 54……………………………………………………………

                                                 第 3 章    菜单与加速键  



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