在刚开始学完c++基本语法之后,发现要用c++写一个窗口应用程序必须与操作系统结合起来,于是自然而然的选择了从mfc入手,但是通过新建的mfc程序发现太过于臃肿,不知道如何下手,因此从网上查阅资料发现可以自己动手使用mfc库实现一个最简单的mfc程序。
1. 由于mfc只是对win32API进行了大量的封装,因此可以通过修改win32项目来创建mfc工程
2. 工程名起名为FirstMFC,然后下一步选择windows应用程序,然后点击完成
3. 创建完成后发现主cpp文件已经为我们自动生成了win32创建窗口的代码,因为要用mfc实现,所以只需保留头文件,删掉其余的代码
FirstMFC.cpp内只剩下如下代码
// FirstMFC.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "FirstMFC.h"
4.由于我们要使用MFC库,因此需要在stdafx头文件里包含afxwin.h 而afxwin.h内已经包含windows.h,因此可以直接将stdafx.h内的#include <windows.h>替换成<afxwin.h>。
5. 右键点击工程名,选择属性,在弹出对话框中MFC使用这一项选择在静态库中使用MFC,然后选择应用确定。
6. 因为mfc程序需要至少包含一个应用程序类和窗口框架类,因此我们需要在FirstMFC.cpp定义一个CFrameWnd和CWinApp的子类,并为CWinApp的子类创建一个全局的实
例化对象,并在CwinApp的子类中重载InitInstance函数创建窗口,代码如下:
class CMyFrameWnd : public CFrameWnd
{
};
class CMyWinApp : public CWinApp
{
virtual BOOL InitInstance();
};
CMyWinApp myApp;
InitInstance函数中创建窗口代码如下<pre name="code" class="cpp">BOOL CMyWinApp::InitInstance()
{
CMyFrameWnd * pFrame = new CMyFrameWnd();
pFrame->Create(NULL,"FirstMFC");
m_pMainWnd = pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return TRUE;
}
从代码可以看出,InitInstance主要完成的工作就是窗口的创建过程,查阅csdn可以发现
CFrameWnd::Create
BOOL Create( LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CWnd* pParentWnd = NULL,
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL );
create函数的第一个参数为类名,可以置空,在创建的过程中mfc会自己重新为它赋值,第二个参数为要创建的窗口的名称,后面的参数固定参数,无须赋值
至此,第一个MFC程序创建完毕,只定义了两个类,重写了一个类成员函数,不像新建一个MFC工程那样生成一大堆的冗余代码,便于我们分析mfc程序的整个执行流程。