MFC的运行及消息机制(一):从一个空项目开始编写MFC程序
对比传统的Win32 API编程,MFC封装了很多东西;而AppWizard的使用,更是隐藏了很多过程。这样使得我们对MFC程序的运行的过程顺序、关系、细节把握不清,难以进行高质量的程序编写。
要想较好的把握MFC,主要的问题有三个方面:
1.对Win32 API编程及Windows平台的基本机制有一定认识(消息队列和消息分类)
2.对程序的编译、链接、装载、库等方面有一定认识
3.对C++的面向对象思想有一定认识(继承和多态、构造函数、this指针等)
在此基础上,全面地了解MFC的运行及消息机制。
本篇从一个空项目开始,不借助AppWizard,如同在控制台环境下那样手写全部源码,利用MFC编写一个简单的Hello World窗口程序.
一 开发环境
VS2010集成开发环境
二 过程
1.从Visual C++中选择添加一个空项目
2.在项目属性-》配置属性-》常规-》项目默认值-》MFC的使用一栏中,选择使用“在共享DLL中使用MFC”(默认是使用标准Windows库)
3.在项目分别建立2个.h头文件和.cpp文件,命名为stdafx.h、main.h和stdafx.cpp、main.cpp. 其中,stdafx.h/cpp主要是为了使用预编
译头功能.为此,需要在项目属性中选择使用预编译头(/Yu); 同时,单独对stdafx.cpp文件的属性进行配置,选择创建预编译头(/Yc). 否则
预编译头功能无法使用.
三 详细
stdafx.h
#ifndef _QINAFX_H#define _QINAFX_H//1.首先包含的是afxwin.h,而在afxwin.h中第一个就包含了afx.h.//2.在afx.h中又包含了afxver_.h,之后就根据编译参数引入导入库:// Win32 libraries////#ifndef _AFXDLL// #ifndef _UNICODE// #ifdef _DEBUG// #pragma comment(lib, "nafxcwd.lib")// #else// #pragma comment(lib, "nafxcw.lib")// #endif// #else// #ifdef _DEBUG// #pragma comment(lib, "uafxcwd.lib")// #else// #pragma comment(lib, "uafxcw.lib")// #endif// #endif//#else// #ifndef _UNICODE// #ifdef _DEBUG// #pragma comment(lib, "mfc" _MFC_FILENAME_VER "d.lib")// #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "d.lib")// #else// #pragma comment(lib, "mfc" _MFC_FILENAME_VER ".lib")// #pragma comment(lib, "mfcs" _MFC_FILENAME_VER ".lib")// #endif// #else// #ifdef _DEBUG// #pragma comment(lib, "mfc" _MFC_FILENAME_VER "ud.lib")// #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "ud.lib")// #else// #pragma comment(lib, "mfc" _MFC_FILENAME_VER "u.lib")// #pragma comment(lib, "mfcs" _MFC_FILENAME_VER "u.lib")// #endif// #endif//#endif////#ifdef _DLL// #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)// #pragma comment(lib, "msvcrtd.lib")// #else// #pragma comment(lib, "msvcrt.lib")// #endif//#else// #if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)// #pragma comment(lib, "libcmtd.lib")// #else// #pragma comment(lib, "libcmt.lib")// #endif//#endif// #pragma comment(lib, "kernel32.lib")// #pragma comment(lib, "user32.lib")// #pragma comment(lib, "gdi32.lib")// #pragma comment(lib, "msimg32.lib")// #pragma comment(lib, "comdlg32.lib")// #pragma comment(lib, "winspool.lib")// #pragma comment(lib, "advapi32.lib")// #pragma comment(lib, "shell32.lib")// #pragma comment(lib, "comctl32.lib")// #pragma comment(lib, "shlwapi.lib")// 接着,添加了CObject、CRuntimeClass、CException、CFile等几个关键类的前向声明.//3.在afxver_.h中,又包含了afxv_w32.h//4.在afxv_w32.h中,包含了windows.h#include<afxwin.h>#endif
main.h
#ifndef _QININSIDE_H#define _QININSIDE_Hclass CMFCApp:public CWinApp{public:virtual BOOL InitInstance();};class CMFCFrmWnd:public CFrameWnd{public:CMFCFrmWnd();protected:afx_msg void OnLButtonDblClk(UINT uFlag, CPoint pt);afx_msg void OnPaint();DECLARE_MESSAGE_MAP()};#endif
stdafx.cpp
#include"stdafx.h"
main.cpp
#include"stdafx.h"#include"main.h"BEGIN_MESSAGE_MAP(CMFCFrmWnd,CFrameWnd)ON_WM_LBUTTONDBLCLK()ON_WM_PAINT()END_MESSAGE_MAP()BOOL CMFCApp::InitInstance(){m_pMainWnd = new CMFCFrmWnd();m_pMainWnd->ShowWindow(m_nCmdShow);m_pMainWnd->UpdateWindow();return true;}CMFCFrmWnd::CMFCFrmWnd(){Create(NULL,_T("InsideMFC"));}void CMFCFrmWnd::OnLButtonDblClk(UINT uFlag, CPoint pt){MessageBox(_T("HELLO WORLD!"),NULL,MB_OK);}void CMFCFrmWnd::OnPaint(){CPaintDC dc(this);dc.TextOut(0,0,_T("HELLO WORLD!"));}CMFCApp theApp;
四 效果图

浙公网安备 33010602011771号