Window应用程序(C/C++)(3) MFC程序的基本框架

本文详细介绍了MFC程序的基本框架,包括MFC项目的类框架、应用程序实例、WinMain函数、窗口类的设计与注册、窗口创建、消息循环和窗口过程,以及如何在窗口中显示按钮。通过C++的MFC库,开发者可以更方便地构建GUI应用程序,理解这些基本概念对于开发Windows应用至关重要。
摘要由CSDN通过智能技术生成

MFC程序的基本框架

3.1 MFC项目的类框架

建立Single document MFC应用程序,向导会为我们自动生成代码,其中有五个重要的类需要注意:

  1. CAboutDlg(派生自CDialog)
  2. CMainFrame(派生自CFrameWnd)
  3. CTestAPP(派生自CWinApp):应用程序类
  4. CTestDoc(派生自CDocument)
  5. CTestView(派生自CView)

这五个类中后三个名字中的Test是项目名称,会随着项目名字变化而变化。

这里涉及到的基类的继承关系可以从下图看出:

MFC类继承关系

最终继承自窗口类(CWnd)的类都和窗口实现有关,CAboutDlg负责帮助对话框,CMainFrame负责主框架窗口,CTestView负责视窗口(在主框架窗口之上)。

3.2 应用程序实例

在一个MFC项目中仅有一个类派生自应用程序类(CWinApp),这个类的名字由C+项目名+App构成。

我们知道在Win32应用程序中通过一个实例句柄(hInstance)来唯一标识应用程序本身,MFC中则有所不同,它通过一个**应用程序类的全局对象(theApp)**来标识应用程序本身。

MFC程序运行的第一件事就是创建CTestApp类的实例(theApp):

//Test.CPP
//创建应用程序实例对象
CTestApp theApp;

//CTestApp构造函数
CTestApp::CTestApp()
{
   
}

创建theApp的同时会调用CTestApp的构造函数,根据C++继承相关的概念,在调用CTestApp的构造函数之前还会先调用基类CWinApp的构造函数,基类构造函数部分代码如下:

//APPCORE.CPP
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;//this指向theApp对象
	ASSERT(AfxGetThread() == this);
	m_hThread = ::GetCurrentThread();
	m_nThreadID = ::GetCurrentThreadId();

	ASSERT(afxCurrentWinApp == NULL);
	pModuleState->m_pCurrentWinApp = this;//this指向theApp对象
	ASSERT(AfxGetApp() == this);
    ......

基类CWinApp构造函数具有一个lpszAppName参数,因此在派生类中应该显式调用。然而由于该构造函数中声明了默认参数,所以实际上并没有显示调用。应用程序类的构造函数完成了应用程序的各种初始化工作。

3.3 WinMain函数

当theApp全局对象成功创建以后就要进入WinMain的环节了,该部分代码如下:

//APPMODUL.CPP
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine, int nCmdShow)//入口函数
{
   
	return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}

这部分代码和Win32中的WinMain并没有什么太大的区别,_tWinMain前面第一篇文章已经介绍过是一个兼容UNICODE和ASCII两种情况的宏。在WinMain函数中调用了AfxWinMain函数,MFC中以Afx开头的函数是应用程序框架函数,他们都是全局函数,可以在任意一个类中调用,此处AfxWinMain函数负责创建,注册窗口类,创建,显示,更新窗口等等工作。

AfxWinMain中分别调用AfxGetThread函数和AfxGetApp函数取得了两个指针pThreadpApp,然后又通过这两个指向theApp的指针调用了三个成员函数完成了一个Windows应用程序的全部必要步骤,部分代码如下:

//WINMAIN.CPP
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine, int nCmdShow)
{
   
	ASSERT(hPrevInstance == NULL);

	int nReturnCode = -1;
	CWinThread* pThread = AfxGetThread();//指向theApp的指针
	CWinApp* pApp = AfxGetApp();//指向theApp的指针

	if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
		goto InitFailure;

	if (pApp != NULL && !pApp->InitApplication())//重要函数1,完成MFC内部管理方面的工作
		goto InitFailure;

	if (!pThread->InitInstance())//重要函数2,该函数是一个虚函数,因此这里调用的是子类的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值