入口点函数简述
以基于MFC多文档Unicode应用程序为例:
系统调用运行期启动函数wWinMainCRTStartup()后,初始化C/C++函数库,构造全局C++对象,静态C++对象。
然后,进入主函数_tWinMain().主函数调用全局函数AfxWinMain().
_tWinMain((HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow){
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
//AfxWinMain()梗概
int AFXAPI AfxWinMain()
{
int nReturnCode = -1;
//取得当前线程地址
CWinThread* pThread = AfxGetThread();
//取得CMyApp对象指针
CWinApp* pApp = AfxGetApp();
//主要用于初始化MFC
AfxWinInit(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
//等价于CMyApp::InitApplication(),MFC用于内部管理
pApp->InitApplication();
//等价于CMyApp::InitInstance
pApp->InitInstance();
nReturnCode = pThread->Run();
AfxWinTerm();
Return nReturnCode;
}
关于pApp->InitInstance():
BOOl CMyApp::InitInstance()
{
//允许应用程序作为控件容器使用,即在程序可以使用ActiveX控件
AfxEnableControlContainer();
//将应用程序的设置保存在注册表中,而非.Ini文件
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
//加载最近使用的文件及最后浏览的状态
LoadStdProfileSettings();
CMultiDocTemplate* pDocTemplate;
//初始化文档模板,RUNTIME_CLASS用于支持RTTI,以后详述
//MFC中的Document/View文档视图架构,就是传说中MVC(Module View Controller,模型视图控制器)架构
//关联文档,框架(控制器),视图
pDocTemplate = new CMultiDocTemplate(
IDR_RESEARTYPE,
RUNTIME_CLASS(CMycDoc),
RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
return TRUE;
}
关于LoadFrame():
BOOL CMDIFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
CWnd* pParentWnd, CCreateContext* pContext)
{
//产生主窗口(并没有显示),加载菜单等元素
if (!CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle,
pParentWnd, pContext))
return FALSE;
m_hMenuDefault = ::GetMenu(m_hWnd);
return TRUE;
}
LoadFrame()内部调用Create(),Create()调用CreateEX(),该函数触发WM_CREATE消息
在CMainFrame头文件MainFrame.h存在消息函数
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
的声明。当然在MainFrame.cpp中也存在消息映射
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
于是,最终会调用OnCreate(),在此函数中加载工具栏,状态栏
然后返回至InitInstance(),显示更新窗口。
从InitInstance()返回至AfxWinMain(),执行pThread->Run()。
进入消息循环,消息经由消息路由机制,在各层消息映射表(Message Map)中寻找对应的消息处理函数。
Run()以后详述。
AfxWinTerm():作用不太清楚,应该与AfxWinInit()相对,释放MFC环境
福利链接:
如何使用Chrome插件,免费上谷歌,谷歌学术,点击打开链接
真男人不能说不行:使用插件,全面提升Chrome的颜值,逼格,易用性,福利,开车技能,点击打开链接