MFC是微软提供给我们的基础类库,是一套面向对象的函数库,以类的方式提供给我们使用。
利用这些类,可以有效地帮助我们完成基于Windows的应用程序的开发。
里面同样有很多全局函数用于类之间的操作调用。
MFC应用程序框架说明
打开创建的Hello工程的工作区,可以看到系统在生成应用程序框架的过程中,自动生成了以下几个类:
CHelloApp
CMainFrame//不变
CHelloView
CHelloDoc
CAboutDlg
(1)CHelloApp类
CHelloApp的基类为CWinApp。如果需要创建MFC应用程序,首先要使用CWinApp类,因为CWinApp类不仅代表了程序中运行的主线程,而且代表了应用程序本身。在任何MFC应用程序中只有一个CWinApp对象,用于控制应用程序的初始化、启动应用程序、运行主消息循环、终止应用程序。
(2)CMainFrame类
类CMainFrame的基类为CFrameWnd,是一个框架窗口。主框架窗口类负责标题栏、菜单栏、工具栏及状态栏的生成。事实上,这些子窗口可以按照用户的意图自定义,只需要修改主框架窗口的实现文件即可。
(3)CHelloView和CHelloDoc类
CHelloView类的基类为CView,而CHelloDoc类的基类为CDocument。之所以把CHelloView类和CHelloDoc类一起介绍是因为这两个类是密切相关的。
视图是显示文档数据的界面,它主要占据着主框架窗口的客户区,视图类不仅把程序文档数据显示出来,它还能接受用户的输入、编辑。视图对象也通过消息与主框架、文档对象相互操作。
文档对象是存储程序数据的地方。一般来说,把要存储的数据放到文档对象中,即把要存储的数据作为文档对象的成员变量,进而实现文档的串行化。
4 查找
找到安装目录->vc98->MFC->Src(MFC的部分源代码) 搜索
(1) search WinMain
APPMODUL.CPP
#define _tWinMain WinMain
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
WinMain设置断点,进行调试
(2)CXXApp构造函数设置断点 产生实例(唯一的) 首先运行构造函数
// The one and only CHelloApp object
CHelloApp theApp;
---父类构造,本类构造
(3)CHelloApp的基类CWinApp 把框架;里面的类和自己要写的类关联在一起
APPCORE.CPP
Ctr+F 查找CwinApp +F3
构造函数
CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName != NULL)
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;
// initialize CWinThread state
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();
// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
pModuleState->m_pCurrentWinApp = this;
ASSERT(AfxGetApp() == this);
// in non-running state until WinMain
m_hInstance = NULL;
m_pszHelpFilePath = NULL;
m_pszProfileName = NULL;
m_pszRegistryKey = NULL;
m_pszExeName = NULL;
m_pRecentFileList = NULL;
m_pDocManager = NULL;
m_atomApp = m_atomSystemTopic = NULL;
m_lpCmdLine = NULL;
m_pCmdInfo = NULL;
// initialize wait cursor state
m_nWaitCursorCount = 0;
m_hcurWaitCursorRestore = NULL;
// initialize current printer state
m_hDevMode = NULL;
m_hDevNames = NULL;
m_nNumPreviewPages = 0; // not specified (defaults to 1)
// initialize DAO state
m_lpfnDaoTerm = NULL; // will be set if AfxDaoInit called
// other initialization
m_bHelpMode = FALSE;
m_nSafetyPoolSize = 512; // default size
}
(4) search AfxWinMain
WINMAIN.CPP
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())调用子类的初始化函数
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
InitFailure:
#ifdef _DEBUG
// Check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif
AfxWinTerm();
return nReturnCode;
}
在子类的初始化函数中 把几个类绑定在一起
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CHelloDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CHelloView));
AddDocTemplate(pDocTemplate);
在子类的初始化函数中 还有
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
(5)search AfxEndDeferRegisterClass 用于注册类
WINCORE.CPP find AfxEnd 1.已经设计好窗口类
find AfxRegisterClass 2.注册窗口类
frame窗口 view窗口
CMainFrame PreCreateWindow设置断点
(6)search CFrameWnd::PreCreateWindow
WINFRM.CPP find CFrameWnd::PreCreateWindow
(7) search CreateEx
WINCORE.CPP CreateEx设置断点
WINFRM.CPP Create设置断点
(8)search CWinThread::Run
THRDCORE.CPP
PumpMessage() 消息循环 设置断点
MFC代码架构分析
最新推荐文章于 2024-09-10 14:17:01 发布