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_H
class 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;

 

四 效果圖

效果圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM