- 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() 消息循环 设置断点