Dissecting MFC 总结(3)

Posted on 2008-02-26 19:11 蓝色山茶 阅读(290) 评论(0)  编辑 收藏 引用

1. MFC常常要用到的一些.H文件

STDAFX.H ---用来作为Precompiled header file,其内只是载入其他的MFC头文件

AFXWIN.H ---每个Windows MFC程序都必须载入,因为它及它所载入的文件声明了所有的MFC类。AFXWIN.H -> AFX.H -> AFXVER_.H -> AFXV_W32.H -> WINDOWS.H

AFXEXT.H ---使用工具栏、状态栏的程序必须载入

AFXDLGS.H ---凡使用通用型对话框(Common Diaglog)的MFC程序必须载入,其内部载入COMMDLG.H

AFXCMN.H ---凡使用Windows 9x新增的通用型控件(Common Control)需载入

AFXCOLL.H ---凡使用Collections Classes需载入

AFXDLLX.H ---凡MFC extension DLLs均需载入

AFXRES.H ---MFC程序的RC文件必须载入

 

2. MFC中,把有着相当固定行为的WinMain内部操作封装在CWinApp中,把有着相当固定行为的WndProc内部操作封装在CFrameWnd中,即:

[1] CWinApp代表程序本体。

[2] CFrameWnd代表一个主框窗体(Frame Window)

几乎可以说CWinApp用来取代WinMain在SDK程序中的地位。传统SDK程序的WinMain所完成的工作由CWinApp的三个函数完成:

virtual BOOL InitApplication();           //注册窗口类的场所!

virtual BOOL InitInstance();                //产生窗口并显示窗口的场所!一定要改写

virtual int Run();                                //攫取消息并分派消息的场所!进入消息循环

 

3. CWinApp类中定义了一个指针m_pCurrentApp,用以取得当前对象的指针(m_pCurrentApp = this)

全局对象theApp(CWinApp的派生类即用户自己的类如CMyWinApp中定义)---Application object

全局函数AfxGetApp()

AfxWinMain中定义指针pApp通过AfxGetApp()取得theApp对象的指针。

 

4. MFC程序的生死过程

    [1] Application object产生,于是内存获得配置,初始值亦设立。

          ↓

    [2] WinMain()

          ↓

    [3] AfxWinMain()→AfxWinInit()→AfxInitThread()

                   ↓

            InitApplication()

                   ↓

            InitInstance()→此处运行过程详解见下面

                   ↓

            ShowWindow()

                   ↓

            UpdateWindow()

                   ↓

            Run()进入消息循环

                   ↓

                 ←

    [4] 结束退出

       其中的InitInstance中运行过程:CMyWinApp::InitInstance中new了一个CMyFrameWnd对象,CMyFrameWnd的构造函数被执行,并调用Create,产生窗口:

       CMyWinApp::InitInstance→CMyFrameWnd::CMyFrameWnd→CFrameWnd::Create→CWnd::CreateEx→CFrameWnd::PreCreateWindow

       更详细的参见p92。

 

5. MFC把消息主要分为三大类,Message Map机制也明定以下三种:

    [1] 标准Windows消息(WM_xxx)的对应规则:

宏名称

对应消息

消息处理函数(名称已默认)

ON_WM_CREATE

WM_CREATE

OnCreate

ON_WM_CHAR

WM_CHAR

OnChar

    [2] 命令消息(WM_COMMAND)的一般性对应规则为:

       ON_COMMAND(<id>, <memberFxn>)

    例如:

       ON_COMMAND(IDM_FLIEOPEN, OnFlieOpen)

    [3] “Notification消息”(由控件产生,例如BN_xxx),因为控件分好几种,故对应机制的宏也分好几种,以下各举一例:

控件

宏名称

消息处理函数

Button

ON_BN_CLICKED(<id>, <memberFxn>)

memberFxn

ComboBox

ON_CBN_DBLCLK(<id>, <memberFxn>)

memberFxn

Edit

ON_EN_SETFOCUS(<id>, <memberFxn>)

memberFxn

ListBox

ON_LBN_ DBLCLK (<id>, <memberFxn>)

memberFxn

 

6. 各个消息处理函数均应以afx_msg void为函数类型。




只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理


posts - 1, comments - 0, trackbacks - 0, articles - 4

Copyright © 蓝色山茶