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为函数类型。