MFC Wizard建立的空應用程序中各個文件內容的解析

建立的MFC應用程序名爲:wd,那麼:shell

1、wd.h解析數據庫

// wd.h : main header file for the WD application
//


#if !defined(AFX_WD_H__89BE48D2_F377_4DF1_8C44_4D7372A61CE0__INCLUDED_)
#define AFX_WD_H__89BE48D2_F377_4DF1_8C44_4D7372A61CE0__INCLUDED_


//////////////////////////////////////////////////////////////////
//下面語句的做用是:推斷當前微軟編譯器的版本號,假設版本號大於1000。那麼「#pragma once」這個語句就會被編譯。
//////////////////////////////////////////////////////////////////


#if _MSC_VER > 1000 //Microsoft Compiler version 在_MSC_VER較小時,它對一些東西的支持與新版不一樣
#pragma once //這是一個比較常用的C/C++雜注,僅僅要在頭文件的最開始加入這條雜注。就可以保證頭文件僅僅被編譯一次
#endif // _MSC_VER > 1000


#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif


#include "resource.h"       // main symbols


/////////////////////////////////////////////////////////////////////////////
// CWdApp:
// See wd.cpp for the implementation of this class
//


class CWdApp : public CWinApp
{
public:
CWdApp();


// Overrides 指示你可以對InitInstance函數進行重載
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWdApp)
public:
virtual BOOL InitInstance(); //它的做用是初始化實例對象,它是一個虛函數,mfc已經定義了這個函數,但你可以重載它來完畢本身的初始化實例功能,假設未定義就會調用Mfc的默認函數。
//}}AFX_VIRTUAL


// Implementation 指示你可以去實現OnAppAbout函數
//{{AFX_MSG(CWdApp)
afx_msg void OnAppAbout(); // afx_msg自己僅僅是一個凝視宏。就是起凝視做用的宏定義,指明當前函數是mfc框架中的消息響應函數;OnApptAbout()函數就是當選擇 "幫助"裏面的 "關於"菜單時。調用的函數一般是彈出一個對話框顯示程序的一些信息
                          
// NOTE - the ClassWizard will add and remove member functions here.
//    DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()//DECLARE_MESSAGE_MAP()宏的做用是向類中加入消息映射必要的結構體和函數聲明。僅僅需要加入一次。放在什麼位置並不重要。就如同類裏其它普通函數的聲明可以相互交換順序同樣。
//函數的修飾符也是可以本身決定的。遵循通常原則。

比方你需要在類外部也可以調用該消息響應函數。就可以定義成public的 }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_WD_H__89BE48D2_F377_4DF1_8C44_4D7372A61CE0__INCLUDED_)編程




2、wd.h相應的.cpp文件wd.cpp解析windows

// wd.cpp : Defines the class behaviors for the application.
//


#include "stdafx.h"
#include "wd.h"


#include "MainFrm.h"
#include "ChildFrm.h"
#include "wdDoc.h"
#include "wdView.h"


///////////////////////////////////////////////////////////////////////////
//如下這段宏定義僅僅是在程序開發和調試時實用,假設軟件已經交付使用,則可以去掉
///////////////////////////////////////////////////////////////////////////


#ifdef _DEBUG  //假設定義了_DEBUG,表示在調試狀態下編譯
#define new DEBUG_NEW //當在debug模式下時。咱們分配內存時的new被替換成DEBUG_NEW,而這個DEBUG_NEW不只要傳入內存塊的大小,還要傳入源文件名稱和行號,這就有個優勢,即當發生內存泄漏時,咱們可以在調試模式下定位到該問題代碼處。若刪掉該句。就不能進行定位了。而在release版本號下的new就是簡單的new,並不會傳入文件名稱和行號。

#undef THIS_FILE //表示清除當前定義的宏,使得THIS_FILE無定義 static char THIS_FILE[] = __FILE__; //將THIS_FILE定義爲一個靜態數組。THIS_FILE是一個char數組全局變量,字符串值爲當前文件的全路徑。這樣在Debug版本號中當程序出錯時出錯處理代碼可用這個變量告訴你是哪一個文件裏的代碼有問題。 //__FILE__ 是編譯器能識別的事先定義的ANSI C 的6個宏之中的一個,__FILE__ 包括當前程序文件名稱的字符串 #endif ///////////////////////////////////////////////////////////////////////////// // CWdApp //消息映射的定義 BEGIN_MESSAGE_MAP(CWdApp, CWinApp) //{{AFX_MSG_MAP(CWdApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //ON_COMMAND 是一個消息映射,這裏是把 ON_COMMAND 消息中的 ID_APP_ABOUT 消息映射到函數 OnAppAbout,假設程序中接到這個消息,就會調用這個函數。 // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWdApp construction CWdApp::CWdApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CWdApp object //////////////////////////////////////////////////////////////////////////// //CSDN中對theApp的使用方法的總結: //1.theApp是你project的頭,你可以經過AfxGetApp()得到整個進程的指針,而後經過它。可以得到該進程的HWND以及HINSTANCE。和菜單。。。等等。不一而足。可以經過msdn得到不少其它的信息 //2.theApp是個全局變量。差點兒可以在程序的不論什麼地方引用。假設你創建一個MDI或者SDIproject,那麼。你可以看到一個類以*App結尾,這個theApp就是它的一個實例,在這個類中加入的public變量可以經過theApp引用。固然,由於WinApp是它的基類,theApp保存有不少有關程序執行期間的很是多信息,如執行程序名,路徑什麼的。數組

//3.加個成員及方法,可以隨時用AfxGetApp訪問 //4.theApp是CWinApp類的派生類的對象,是一個全局變量。安全

全局變量在WinMain()前被建立。 //5.theApp就是應用程序的實例,沒有他你就什麼都不能作啊!架構

他初始了進程啊。 //6.你可以理解爲 theApp像通常程序中的main函數同樣。app

///////////////////////////////////////////////////////////////////////////// CWdApp theApp; ///////////////////////////////////////////////////////////////////////////// // CWdApp initialization BOOL CWdApp::InitInstance() { ///////////////////////////////////////////////////////////////////////// //要想在應用程序中使用ActiveX控件,必須使你的應用程序成爲ActiveX控件包容器。 //ActiveX 控件包容器就是全然支持ActiveX控件,並能把控件組合進本身的窗體或對話框的父應用程序。 //利用MFC的AppWizard,你可以很是方便地建立你的包容器程序。框架

其實。在用AppWizard建立新的應用程序時, //你的應用程序就被缺省設置爲控件包容器。即在第3步選中支持ActiveX Controls的複選框。ide

假設你在建立過程當中沒有選擇這項技術支持。 //之後也可以手動地加入這項支持。

假設你手動加入這個函數,和APPWIZEARD加入效果是同樣的 ///////////////////////////////////////////////////////////////////////// AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. ////////////////////////////////////////////////////////////////////////// //假設原文件定義了_AFXDLL,說明原文件裏有某些類,函數等,是以MFC DLL的形式提供的(也就是動態鏈接到MFC), //假設原文件裏沒定義_AFXDLL。則這些類。函數等的實現代碼是被直接插入原文件(也就是靜態鏈接到MFC) //Enable3dControls()和Enable3dControlsStatic()函數的做用 //假設成功地加載了CTL3D32.DLL,則爲TRUE;不然爲FALSE。 //假設操做系統支持控件的三維外觀,則這個函數將返回FALSE。 /////////////////////////////////////////////////////////////////////////// #ifdef _AFXDLL Enable3dControls();// Call this when using MFC in a shared DLL #else Enable3dControlsStatic();// Call this when linking to MFC statically #endif // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications"));//這個函數的功能是:設置MFC程序的註冊表訪問鍵,並把讀寫ini文件的成員函數映射到讀寫註冊表。

/////////////////////////////////////////////////////////////////////// //This method is called from within the InitInstance method to enable and load the list of most recently used (MRU) files and last preview state. If nMaxMRU is zero, no MRU list will be maintained. //近期文件列表可以讓你很是方便地打開你之前之前打開過的文件,那麼,怎樣爲本身的應用程序加入近期文件列表功能呢?最簡單的方法就是在你新建project的時候選擇包括近期文件列表功能,也就是在 MFC AppWizard 的第 4 步的時候使 「How many files would you like on your recent file list?」 的值不爲 0 就能夠。 LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. //////////////////////////////////////////////////////////////////////////// //像MVC架構同樣,Model-View-Controller(MVC),當中的Model就是MFC的Document, //而Controller至關於MFC的Document Template。 //每當使用者欲打開一份文件,程序應該作出Document、View、Frame各一份。 //這三個成爲一個執行單元,由所謂的Document Template掌管。 //MFC有一個CDocTemplate負責此事,他又有兩個派生類。各自是CMultiDocTemplate和CSingleDocTemplate。

//假設你的程序可以處理兩中數據類型。你必須製造兩個Document Template,並使用AddDocTemplate函數將他們一一加入系統之中 //誰來管理Document Template呢?是CWinApp。

也就是如下InitInstance中應有的相關行爲: CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_WDTYPE, RUNTIME_CLASS(CWdDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CWdView)); AddDocTemplate(pDocTemplate); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame;//使用此數據成員存儲指向您的線程的主窗體對象 //////////////////////////////////////////////////////////////////////// //MFC應用通常都會在它的應用對象中使用函數InitInstance建立這個類的一個本地實例。

//而後把該對象傳給CWinApp::ParseCommandLine。ParseCommandLine又反覆調用ParseParam填充CCommandLineInfo對象。 //最後,CCommandLineInfo對象被傳給CWinApp::ProcessShellCommand來處理命令行參數和選項 // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The main window has been initialized, so show and update it. pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About //定義「關於」窗體的相關內容 class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) ////申明枚舉類型用enum開頭,花括弧中把IDD_ABOUTBOX的值賦給IDD;原本假設不賦值的話, //IDD值就默以爲0(注意枚舉元素看作常量,故有肯定值)。而編者想改變IDD的值爲IDD_ABOUTBOX的值,故進行了賦值。 //const int IDD = IDD_ABOUTBOX enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: //DoDataExchange(CDataExchange* pDX) 是MFC CWnd的一個重要的函數。 //在此函數中可以利用一系列的DDX_xxxx(..)函數實現UI與data的數據交互。以及用DDV_xxx(...)來實現數據驗證 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog //模態對話框的消息處理 //(1) 模態對話框彈出來後。首先會讓父窗體失效,使其不能接受用戶的輸入(鍵盤鼠標消息)。 //1 EnableWindow(hwndParent, FALSE) ; //(2) 父窗體消息循環被堵塞(會卡在DoModal處,等待返回),由模態對話框的消息循環來接管(所以整個程序不會卡住)。

//接管後,模態對話框的消息循環仍然會將屬於父窗體及其子控件的窗體消息(不包括鍵盤鼠標相關的窗體消息)發送給它們各自的WindowProc窗體函數。進行響應處理。 //(3) 模態對話框銷燬時(點擊IDOK或IDCANCEL),父窗體消息循環又一次激活,繼續DoModal後的邏輯。

// 激活後。父窗體有可以又一次接受用戶的輸入(鍵盤鼠標消息)。 //1 EnableWindow(hwndParent, TRUE) ; //從上面的過程當中,咱們可以獲得例如如下結論: //對於窗體消息,模態對話框主窗體(及其子控件)與父窗體(及其子控件)都是用自身的WindowProc函數接收並處理,互不干擾。 //僅僅是父窗體(及其子控件)沒法接受到鍵盤鼠標消息相關的窗體消息。 //對於命令消息,由模態對話框主窗體的WindowProc接收。

可以在模態對話框主窗體的OnCmdMsg中作命令繞行。使得其它的CCmdTarget對象也可以處理命令消息。 //對於控件通知,由其父窗體的WindowProc接收並處理,通常不進行命令繞行被其它的CCmdTarget對象處理。

void CWdApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CWdApp message handlers




3、wdDoc.h解析

// wdDoc.h : interface of the CWdDoc class
//
/////////////////////////////////////////////////////////////////////////////


#if !defined(AFX_WDDOC_H__F4400C08_CE4D_4041_AEA6_E5197466CE3A__INCLUDED_)
#define AFX_WDDOC_H__F4400C08_CE4D_4041_AEA6_E5197466CE3A__INCLUDED_


#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000




class CWdDoc : public CDocument
{
//MFC中的CDocument類,是文檔類。

//要理解這個類的做用,首先你要明確MFC中 文檔/視圖結構 的概念。 //文檔/視圖結構中,將框架窗體(CFrameWnd)、視圖窗體(CView)、文檔類(CDocument)捆綁到一個「模板」類,造成一個標準的窗體模板CDocTemplate。 //這個概念中,以爲一個窗體,應該是有「數據支撐「的,也就是需要很是多數據、變量。可能需要訪問文件、數據庫等等,而這些數據和操做,放在視圖窗體類是不合理的(因爲這些東西不符合窗體元素的概念)。而且多視圖訪問文檔類公用數據也會很是方便(多視圖之間的訪問並不方便),同一時候也避免讓視圖類過於臃腫龐大。 //基於這些理念。MFC設計了一個文檔類。專門用於文件操做、序列化操做等。並協助模板類管理視圖。 //MFC中。一個文檔/視圖結構。包括了惟一的模板類、惟一的文檔類、惟一的框架窗體和一個或多個視圖窗體。在不論什麼視圖中都可以方便的訪問文檔類的數據。

protected: // create from serialization only CWdDoc(); //使用DECLARE_DYNCREATE宏可以使每個CObject的派生類的對象具備執行時動態建立的能力。 //框架利用這樣的能力來動態建立對象。好比,當它在串行化過程當中從磁盤讀取對象的時候。 //文檔、視圖和框架類必須支持動態建立,因爲框架需要動態地建立它們。

//在類的.H模塊中增長DECLARE_DYNCREATE宏,而後在每個需要訪問這個類的對象的.CPP模塊中包括這個模塊。 //假設在類聲明中包括了DECLARE_DYNCREATE。那麼必須在類的實現中包括IMPLEMENT_DYNCREATE宏。 DECLARE_DYNCREATE(CWdDoc) // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CWdDoc) public: //建立一個新文檔時程序的消息響應函數,通常用於編寫建立新文檔時用戶對本身文檔對象的內容初始化內容。 //比方建立一個文檔。顯示一個圓。在OnNewDocument中可以設置圓心位置和半徑 virtual BOOL OnNewDocument(); //從檔案文件裏讀取該對象或向檔案文件裏寫入該對象。 //必須爲但願串行化的每個類覆蓋Serialize。被覆蓋的Serialize首先必須調用基類的Serialize函數。 //在類的聲明中必須使用DECLARE_SERIAL宏,而且在類的執行過程當中也必須使用IMPLEMENT_SERIAL宏。 //使用CArchive::IsLoading或CArchive::IsStoring函數,用於決定是否裝載或存儲了檔案文件。

//經過CArchive::ReadObject和CArchive::WriteObject來調用Serialize函數。這些函數與CArchive插入操做符()相關聯。 //CArchive 對象提供了一個類型安全緩衝機制,用於將可序列化對象寫入 CFile 對象或從中讀取可序列化對象。 //一般。CFile 對象表示磁盤文件。但是,它也可以是表示「剪貼板」的內存文件(CSharedFile 對象) virtual void Serialize(CArchive& ar); //}}AFX_VIRTUAL // Implementation public: virtual ~CWdDoc(); #ifdef _DEBUG //MSDN中對AssertValid的說明:When you write your own class, //you should override the AssertValid function to provide diagnostic services //for yourself and other users of your class. //The overridden AssertValid usually calls the AssertValid function of its base class before checking data members unique to the derived class. //看一個樣例,馬上明確:主要是在debug模式時比較實用 //void CAge::AssertValid() const //{ //CObject::AssertValid(); //ASSERT( m_years > 0 ); //ASSERT( m_years < 105 ); //} virtual void AssertValid() const; //在VC6.0或VC8.0的菜單項——視圖(View)下,有個輸出(Output)子菜單項。你在編譯或調試時,都會出來一個輸出子窗體。 //輸出子窗體的信息那裏來的?事實上大部分信息都是由一個全局對象CDumpContext afxDump提供,因爲afxDump是全局對象, //你在不論什麼MFC程序的不論什麼CObject的派生類中都可以操做它。CDumpContext的構造函數關聯了一個文件類,MFC本身會往裏面寫入很是多信息。 //同一時候編程人員經過重載Dump(CDumpContext& dc)函數。也可以向輸出窗體輸出信息。dc指針指向全局對象afxDump,dc的使用有點向cout,好比: //dc << "Hello World!" << endl; //通常CDumpContext由編程環境調用,事實上我們編程人員也可以自定義新的CDumpContext對象,它的構造函數需要一個CFile指針,你可以把需要的信息寫的這個關聯文件裏面。 //總之,Dump函數的做用可以簡單理解爲:爲調試程序作一些輸出準備的。 virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: //{{AFX_MSG(CWdDoc) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_WDDOC_H__F4400C08_CE4D_4041_AEA6_E5197466CE3A__INCLUDED_)



4、wdDoc.cpp解析

// wdDoc.cpp : implementation of the CWdDoc class
//


#include "stdafx.h"
#include "wd.h"


#include "wdDoc.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CWdDoc


//經過DECLARE_DYNCREATE宏來使用IMPLEMENT_DYNCREATE宏,以贊成CObject派生類對象在執行時本身主動創建。

IMPLEMENT_DYNCREATE(CWdDoc, CDocument) BEGIN_MESSAGE_MAP(CWdDoc, CDocument) //{{AFX_MSG_MAP(CWdDoc) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CWdDoc construction/destruction CWdDoc::CWdDoc() { // TODO: add one-time construction code here } CWdDoc::~CWdDoc() { } BOOL CWdDoc::OnNewDocument() { if (!CDocument::OnNewDocument())//首先調用父類CDocument的OnNewDocument函數 return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CWdDoc serialization void CWdDoc::Serialize(CArchive& ar) { /* 就是推斷是保存文件仍是讀取文件 CArchive 對象既可以用來保存文件又可以用來讀取文件 進行推斷是保存仍是讀取。以肯定怎樣進行操做。 CArchive::IsStoring BOOL IsStorng( ) const; 返回值: 假設正在存儲歸檔文件,則返回非零值,不然爲0。

*/ if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } ///////////////////////////////////////////////////////////////////////////// // CWdDoc diagnostics #ifdef _DEBUG void CWdDoc::AssertValid() const { CDocument::AssertValid();//調用父類的斷言驗證函數 } void CWdDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc);//調用父類的Dump函數 } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CWdDoc commands




5、wdView.h文件解析

// wdView.h : interface of the CWdView class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_WDVIEW_H__F5CC8836_372A_495A_9999_190EB90AB633__INCLUDED_)
#define AFX_WDVIEW_H__F5CC8836_372A_495A_9999_190EB90AB633__INCLUDED_

#if _MSC_VER > 1000

/*
這裏在對#pragma進行一個解釋:
在所有的預處理指令中。#Pragma 指令多是最複雜的了,
它的做用是設定編譯器的狀態或者是指示編譯器完畢一些特定的動做。
#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言全然兼容的狀況下。
給出主機或操做系統專有的特徵。

反正記住:#pragma是針對編譯器的預處理指令 便可了
*/
#pragma once
#endif // _MSC_VER > 1000


class CWdView : public CView
{
protected: // create from serialization only
	CWdView();
	DECLARE_DYNCREATE(CWdView)//與CDocument同樣,這裏DECLARE_DYNCREATE宏定義。也是爲了使得CWdView類具備執行時動態建立的能力

// Attributes
public:
	/*
		視圖對象是用來顯示文檔對象的內容。函數GetDocument()用於獲取當前文檔對象的指針
		經過獲取的文檔類指針可以在視圖中顯示文檔內容
	*/
	CWdDoc* GetDocument();

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CWdView)
	public:
	/*
	OnDraw函數是一般在裏邊寫渲染文檔的代碼
	當中CDC類是設備描寫敘述表 在windows編程的時候要用到的,沒必要關係其內部實現,僅僅管調用其擁有的函數便可。

Windows使用與設備無關的圖形設備環境(DC :Device Context) 進行顯示 。

MFC基礎類庫定義了設備環境對象類----CDC類 在Windows應用程序中。設備環境與圖形對象共同工做,協同完畢畫圖顯示工做。就像畫家繪畫同樣,設備環境比如是畫家的畫布,圖形對象比如是畫家的畫筆。

*/ virtual void OnDraw(CDC* pDC); // overridden to draw this view /* PreCreateWindow是窗體類的虛函數,可以在本身的窗體類中重載此函數,用以改變窗體的樣式, 對mfc來講,這個函數是隱式調用的,不用本身顯式調用。

僅僅要窗體被建立,則這個函數已經本身主動調用了。 你僅僅需要在需要的時候把這個函數重寫一下就可以了 REATESTRUCT是一個結構,可以依據本身的需要改動這個結構的成員,以此改變新建的窗體的外觀 */ virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: //////////////////////////////////////////////////// //下面函數是在MFC中CView類已經封裝好了打印相關的功能函數 /*OnPreparePrinting方法在打印或預覽文檔前由MFC調用,在OnPreparePrinting函數中準備信息打印CPrintInfo* pInfo; 其原型例如如下:pInfo參數是指向包括當前打印做業信息的CPrintInfo對象的指針。 注意:假設打印做業被用戶在結果打印對話框中取消,則 CView::OnPreparePrinting()方法調用CView::DoPreparePrinting()方法並返回零值。 */ virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); /* MSDN上的解釋:Called by the framework at the beginning of a print or print preview job, after OnPreparePrinting has been called */ virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); /* 打印結束時調用的函數 */ virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL // Implementation public: virtual ~CWdView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // Generated message map functions protected: //{{AFX_MSG(CWdView) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; #ifndef _DEBUG // debug version in wdView.cpp inline CWdDoc* CWdView::GetDocument()//GetDocument()函數默認返回一個Doc指針 { return (CWdDoc*)m_pDocument; } #endif ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_WDVIEW_H__F5CC8836_372A_495A_9999_190EB90AB633__INCLUDED_)



6、wdView.cpp文件解析

// wdView.cpp : implementation of the CWdView class
//

#include "stdafx.h"
#include "wd.h"

#include "wdDoc.h"
#include "wdView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWdView

IMPLEMENT_DYNCREATE(CWdView, CView)

BEGIN_MESSAGE_MAP(CWdView, CView)
	//{{AFX_MSG_MAP(CWdView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWdView construction/destruction

CWdView::CWdView()
{
	// TODO: add construction code here

}

CWdView::~CWdView()
{
}

BOOL CWdView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);//默認首先調用父類的PreCreateWindow函數
}

/////////////////////////////////////////////////////////////////////////////
// CWdView drawing

void CWdView::OnDraw(CDC* pDC)
{
	CWdDoc* pDoc = GetDocument();//首先獲取將被顯示在窗體中的數據對象 
	ASSERT_VALID(pDoc);//用來調試,主要推斷 Doc對象是否獲取成功;
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CWdView printing

BOOL CWdView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);//首先調用父類的打印準備函數
}

void CWdView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CWdView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CWdView diagnostics

#ifdef _DEBUG
void CWdView::AssertValid() const
{
	CView::AssertValid();
}

void CWdView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CWdDoc* CWdView::GetDocument() // non-debug version is inline
{
	//這裏的m_pDocument是指向將要別序列化的Doc類,m_pDocument定義在CArchive類中
	//此處推斷獲取的Doc是不是需要的執行時類
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWdDoc)));
	return (CWdDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWdView message handlers

奮鬥奮鬥奮鬥奮鬥至此,6個比較關鍵的文件解析完成。來一個漂亮的切割線,接下來解析剩下的文件奮鬥奮鬥奮鬥奮鬥

7、StdAfx.h文件解析

// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//
//////////////////////////////////////////////////////////////////////
/*
一、首先對StdAfx這個名字進行解析,這個名字是Standard Application Fram Extend的縮寫 
二、籠統的講,這個文件沒有函數庫。僅僅是定義了一些環境參數,添加所需的系統庫,使得編譯出來的程序能在32位的操做系統環境下執行,
三、它存在的意義,是一個巧妙製做,請細緻閱讀:
Windows和MFC的include文件都很是大。即便有一個高速的處理程序,編譯程序也要花費至關長的時間來完畢工做。

由於每個.CPP文件都包括一樣的include文件,爲每個.CPP文件都反覆處理這些文件就顯得很是傻了。

爲避免這樣的浪費,AppWizard和VisualC++編譯程序一塊兒進行工做,例如如下所看到的: ◎AppWizard創建了文件stdafx.h,該文件包括了所有當前project文件需要的MFCinclude文件。且這一文件可以隨被選擇的選項而變化。 ◎AppWizard而後就創建stdafx.cpp。這個文件一般都是同樣的。

◎而後AppWizard就創建起project文件,這樣第一個被編譯的文件就是stdafx.cpp。 ◎當VisualC++編譯stdafx.cpp文件時。它將結果保存在一個名爲stdafx.pch的文件中。(擴展名pch表示預編譯頭文件。

) ◎當VisualC++編譯隨後的每個.cpp文件時,它閱讀並使用它剛生成的.pch文件。VisualC++再也不分析Windowsinclude文件。除非你又編緝了stdafx.cpp或stdafx.h。 這個技術很是靜止,你不這麼以爲嗎?(還要說一句。Microsoft並非是首先採用這樣的技術的公司,Borland纔是。)在這個過程當中你必須遵照下面規則: ◎你編寫的不論什麼.cpp文件都必須首先包括stdafx.h。 ◎假設你有project文件中的大多數.cpp文件需要.h文件,順便將它們加在stdafx.h(後部)上,而後預編譯stdafx.cpp。 ◎由於.pch文件具備大量的符號信息,它是你的project文件中最大的文件。

假設你的磁盤空間有限。你就但願能將這個你從沒使用過的project文件中的.pch文件刪除。

執行程序時並不需要它們,且隨着project文件的又一次創建。它們也本身主動地又一次創建 */ #if !defined(AFX_STDAFX_H__1D7D39ED_AD6E_4D9F_A5D7_546C4C48DE9E__INCLUDED_) #define AFX_STDAFX_H__1D7D39ED_AD6E_4D9F_A5D7_546C4C48DE9E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__1D7D39ED_AD6E_4D9F_A5D7_546C4C48DE9E__INCLUDED_)



8、StdAfx.cpp文件解析(這個沒啥講的喔!

// stdafx.cpp : source file that includes just the standard includes
//	wd.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"


9、Resource.h和wd.rc文件解析

首先,Resourch.h文件是一個頭文件。該文件的解析例如如下:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by WD.RC
//
/////////////////////////////////////////////
/*
一、VC會依據你在可視化界面的設計,會本身主動管理該文件.包含.rc文件
二、當你加入一個資源並保存時,VC會本身主動在resource.h文件中添加一個宏定義。

該定義肯定資源的ID。

但是當你刪除一個資源時,VC並不會在resource.h中刪除該ID的定義。只是這個並不會影響你對資源的使用。 因爲當你下次加入資源時以一樣的ID來定位資源時。VC會本身主動搜索頭文件,假設已經存在並且未被使用,則不又一次定義該ID。 假設已經存在且已經被使用。系統將會對你進行提示 三、resource.h就是.rc文件的頭文件 .rc文件中的常量全在resource.h定義 普通狀況下不用你去寫和改動 vc會幫你寫和改 */ #define IDD_ABOUTBOX 100 #define IDR_MAINFRAME 128 #define IDR_WDTYPE 129 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 130 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_COMMAND_VALUE 32771 #endif #endif



其次,wd.rc是一個和Resourch.h相應的文件夾,存放Resource.h中相應ID的資源。假設不能理解這句,可以在你的project裏面打開xx.rc文件看看就能夠。

10、MainFrm.h文件解析

MainFrm.h是用來生存程序主窗體的MainFrm.cpp類的頭文件;

// MainFrm.h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_MAINFRM_H__66FE9084_4CA5_468F_AD1F_25852054AC1F__INCLUDED_)
#define AFX_MAINFRM_H__66FE9084_4CA5_468F_AD1F_25852054AC1F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CMainFrame : public CMDIFrameWnd
{
	DECLARE_DYNAMIC(CMainFrame)//相同。這一句是爲了使得該類能夠在執行時建立
public:
	CMainFrame();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMainFrame)

	/*
	PreCreateWindow(CREATESTRUCT& cs)函數是在建立主窗體以前,
	要作的一些操做,它在OnCreate函數調用以前被調用。
	當中基本的內容都沒必要改動,除了對框架的屬性以及加入響應函數時可能進行改動
	*/
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CMainFrame();
#ifdef _DEBUG//相同是爲了調試時檢查用的斷言
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

protected:  // control bar embedded members
	CStatusBar  m_wndStatusBar;//一個CStatusBar 對象是一個帶有一行文本輸出窗格的控件。或者稱爲「指示器」。

這些輸出窗格常被用做消息行和狀態指示器。 CToolBar m_wndToolBar;//工具條是一個CToolBar類對象。一般做爲成員對象嵌入程序的CMainFrame類中,也就是說嵌入主框架窗體中。所以。MFC生成框架窗體的時候同一時候生成工具條,銷燬框架窗體的時候同一時候銷燬工具條 // Generated message map functions protected: //{{AFX_MSG(CMainFrame) /* 一、OnCreate主要用來建立窗體的風格,如最大化、最小化窗體、寬度等 二、當中的LPCREATESTRUCT是一指向結構體createstruct的指針。該結構體中定義窗體的一些基本信息如x,y座標等。 */ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; ///////////////////////////////////////////////////////////////////////////// //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_MAINFRM_H__66FE9084_4CA5_468F_AD1F_25852054AC1F__INCLUDED_)


11、MainFrm.cpp類解析

MainFrm.cpp類是用來生存主窗體的

// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "wd.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)//與頭文件裏的Declare相應

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	ON_WM_CREATE()//WM_CREATE的消息映射入口項:ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/*
一、調用CMFCStatusBar::SetIndicators函數爲狀態欄劃分窗格,併爲每個指示器設置顯示文本。

   CMFCStatusBar::SetIndicators函數需要一個ID數組的參數。在MainFrm.cpp中,例如如下定義了一個窗格ID的數組indicators[]
二、   indicators數組定義了狀態欄窗格的劃分信息。第一個元素通常爲ID_SEPARATOR,相應的窗格用來顯示命令提示信息。
上面數組中的後三項爲指示器文本的字符串ID,可以依據這些ID在String Table字符串資源中找到相應的字符串,查找方法是,
在Resource View資源視圖中。打開String Table字符串資源,可以看到有ID、Value和Caption三列,在ID列中找到需要的ID,
相應的Caption列文本就是要查找的字符串。

ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL相應的字符串各自是CAP、NUM、SCRL。 相應的三個窗格分別爲Caps Lock指示器、Num Lock指示器和Scroll Lock指示器。

*/ static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } /* 建立主窗體 */ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { //若父類CMDIFramWnd建立失敗,則返回-1 if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //載入toolbar if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { /* 一、這裏看到TRACE0這個玩意,看來是爲調試而準備的。 二、 TRACE0 TRACE0(exp) 說明: 與TRACE相似,但他把跟蹤字符串放在代碼段中,而不是DGROUP,所以使用少的DGROUP空間。 TRACE0是一組跟蹤宏的一個變體。這些宏可用於調試輸出。這一組包含TRACE0,TRACE1,TRACE2和TRACE3,這些宏不一樣在於所取參數的數目不一樣。

TRACE0僅僅取一個格式化字符串並可用於簡單文本消息。

TRACE1取一格式化字符串加上一個變量——一個將轉儲的變量。 相同。TRACE2,TRACE3分別取2個或3個參數(在格式化字符串以後)。假設用戶以便以了應用程序的發行版。那麼它僅僅把數據轉儲到afxDump。 凝視: 此宏僅僅在MFC的DEBUG中有效。 */ TRACE0("Failed to create toolbar\n"); return -1; // fail to create } //載入狀態欄 if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable //很是顯然。如下的三行主要用於設置工具欄和菜單條可停靠,可在生成的主窗體的 查看 下看到 工具欄和 菜單條 是否可停靠。 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; } /* 默認調用父類CMDIFramWnd的PreCreateWindows函數 */ BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CMDIFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CMDIFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CMDIFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers

12、ChildFrm.h文件解析

ChilFrm.h文件是應用程序子窗體生成類ChildFrm.cpp的頭文件。比較簡單。基本不用說了,因爲裏面的東西前面已經說過很是屢次了

// ChildFrm.h : interface of the CChildFrame class
//
/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_CHILDFRM_H__2976A9A6_F4A2_45CC_99C0_06074DF20356__INCLUDED_)
#define AFX_CHILDFRM_H__2976A9A6_F4A2_45CC_99C0_06074DF20356__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


class CChildFrame : public CMDIChildWnd
{
	DECLARE_DYNCREATE(CChildFrame)//聲明該類執行時可建立
public:
	CChildFrame();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CChildFrame)
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CChildFrame();
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

// Generated message map functions
protected:
	//{{AFX_MSG(CChildFrame)
		// NOTE - the ClassWizard will add and remove member functions here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CHILDFRM_H__2976A9A6_F4A2_45CC_99C0_06074DF20356__INCLUDED_)

十3、ChildFrm.cpp

// ChildFrm.cpp : implementation of the CChildFrame class
//

#include "stdafx.h"
#include "wd.h"

#include "ChildFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CChildFrame

IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)

BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
	//{{AFX_MSG_MAP(CChildFrame)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code !
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CChildFrame construction/destruction

CChildFrame::CChildFrame()
{
	// TODO: add member initialization code here
	
}

CChildFrame::~CChildFrame()
{
}

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	if( !CMDIChildWnd::PreCreateWindow(cs) )
		return FALSE;

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CChildFrame diagnostics

#ifdef _DEBUG
void CChildFrame::AssertValid() const
{
	CMDIChildWnd::AssertValid();
}

void CChildFrame::Dump(CDumpContext& dc) const
{
	CMDIChildWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CChildFrame message handlers

吐舌頭至此,wdproject的wd files文件夾下的 Source Files和Header Files文件夾下的文件解析完成。對MFC有沒有感受了現在?接下來解釋 wd project下的Resource Files文件夾下的文件

十4、Toolbar.bmp

顯然是工具欄的bmp圖

十5、wd.ico

顯然是MFC窗體的圖標

十6、wdDoc.ico

顯然是文檔的圖標

十7、wd.rc2解析

一、rc和rc2都是資源文件,包括了應用程序中用到的所有的資源。

二、二者不一樣在於:rc文件裏的資源可以直接在VC集成環境中以可視化的方法進行編輯和改動;

     而rc2中的資源不能在VC的集成環境下直接進行編輯和改動, 而是由依據需要手工地進行編輯。

三、RC2文件:包括項目使用的附加資源的腳本文件。

可以在項目的 .rc 文件的頂部包括 .rc2 文件。 
四、.rc2 文件用於存放由多個不一樣項目使用的資源。沒必要爲不一樣的項目屢次建立一樣的資源。而是可以將它們放在一個 .rc2 文件裏。而後將該 .rc2 文件包含在主 .rc 文件裏。

五、.rc2 擴展資源文件,當調用到其餘project的資源的時候就會產生。用到資源的時候,比方說一個圖片等等……

吐舌頭至此,wdproject的wd files文件夾下的 Resource Files文件夾下的文件解析完成,接下來解析wd files文件夾下的最後一個文件夾External Dependencies文件夾下的文件

十8、basetsd.h文件解析

/*++

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

    basetsd.h

Abstract:

    Type definitions for the basic sized types.

Author:

    Jeff Havens (jhavens)   23-Oct-1997

Revision History:

--*/

/*
一、爲了幫助程序猿改動現有的源碼。轉而使用新的數據類型,microsoft將在nt 5.0 beta 2版中包括一些開發輔助工具,當中包括一個定義新數據類型的頭文件basetsd.h和一個語法檢查器。
二、由於不能將指針轉換成int、uint、long、ulong、dword等字長固定爲32位的類型,假設需要對指針作運算,應把指針轉換爲int-ptr或uint-ptr。這兩種類型在不一樣平臺上纔有正確的字長。另外,由於handle實質上是一個指針(void *),所以把handle轉換成long或ulong等類型也是不對的。
三、假設需要對指針進行截斷,那麼應使用ptrtolong()和ptrtoulong()兩個函數(在basetsd.h中定義)來進行,它們能夠屏蔽掉指針截斷警告,只是截斷的結果不能夠再當指針使用了。
四、說白了。這是微軟新增的一個對指針操做的一種新的工具
*/

#ifndef _BASETSD_H_
#define _BASETSD_H_

#ifdef __cplusplus
extern "C" {
#endif

//
// The following types are guaranteed to be signed and 32 bits wide.
//

typedef int LONG32, *PLONG32;
typedef int INT32, *PINT32;

//
// The following types are guaranteed to be unsigned and 32 bits wide.
//

typedef unsigned int ULONG32, *PULONG32;
typedef unsigned int DWORD32, *PDWORD32;
typedef unsigned int UINT32, *PUINT32;

//
// The INT_PTR is guaranteed to be the same size as a pointer.  Its
// size with change with pointer size (32/64).  It should be used
// anywhere that a pointer is cast to an integer type. UINT_PTR is
// the unsigned variation.
//
// HALF_PTR is half the size of a pointer it intended for use with
// within strcuture which contain a pointer and two small fields.
// UHALF_PTR is the unsigned variation.
//

#ifdef _WIN64

typedef __int64 INT_PTR, *PINT_PTR;
typedef unsigned __int64 UINT_PTR, *PUINT_PTR;

#define MAXINT_PTR (0x7fffffffffffffffI64)
#define MININT_PTR (0x8000000000000000I64)
#define MAXUINT_PTR (0xffffffffffffffffUI64)

typedef unsigned int UHALF_PTR, *PUHALF_PTR;
typedef int HALF_PTR, *PHALF_PTR;

#define MAXUHALF_PTR (0xffffffffUL)
#define MAXHALF_PTR (0x7fffffffL)
#define MINHALF_PTR (0x80000000L)

#pragma warning(disable:4311)   // type cast truncation

#if !defined(__midl)
__inline
unsigned long
HandleToUlong(
    void *h
    )
{
    return((unsigned long) h );
}

__inline
unsigned long
PtrToUlong(
    void  *p
    )
{
    return((unsigned long) p );
}

__inline
unsigned short
PtrToUshort(
    void  *p
    )
{
    return((unsigned short) p );
}

__inline
long
PtrToLong(
    void  *p
    )
{
    return((long) p );
}

__inline
short
PtrToShort(
    void  *p
    )
{
    return((short) p );
}
#endif
#pragma warning(3:4311)   // type cast truncation

#else


typedef long INT_PTR, *PINT_PTR;
typedef unsigned long UINT_PTR, *PUINT_PTR;

#define MAXINT_PTR (0x7fffffffL)
#define MININT_PTR (0x80000000L)
#define MAXUINT_PTR (0xffffffffUL)

typedef unsigned short UHALF_PTR, *PUHALF_PTR;
typedef short HALF_PTR, *PHALF_PTR;

#define MAXUHALF_PTR 0xffff
#define MAXHALF_PTR 0x7fff
#define MINHALF_PTR 0x8000

#define HandleToUlong( h ) ((ULONG) (h) )
#define PtrToUlong( p ) ((ULONG) (p) )
#define PtrToLong( p ) ((LONG) (p) )
#define PtrToUshort( p ) ((unsigned short) (p) )
#define PtrToShort( p ) ((short) (p) )

#endif

//
// SIZE_T used for counts or ranges which need to span the range of
// of a pointer.  SSIZE_T is the signed variation.
//

typedef UINT_PTR SIZE_T, *PSIZE_T;
typedef INT_PTR SSIZE_T, *PSSIZE_T;

//
// The following types are guaranteed to be signed and 64 bits wide.
//

typedef __int64 LONG64, *PLONG64;
typedef __int64 INT64, *PINT64;


//
// The following types are guaranteed to be unsigned and 64 bits wide.
//

typedef unsigned __int64 ULONG64, *PULONG64;
typedef unsigned __int64 DWORD64, *PDWORD64;
typedef unsigned __int64 UINT64, *PUINT64;

#ifdef __cplusplus
}
#endif

#endif // _BASETSD_H_

最終結束了,請深吸氣回來。呼氣出去!對MFC的每個文件心存感激。接下來。好好在這個wizard給予咱們的空project框架上譜寫本身東西吧!

加油!

相關文章
相關標籤/搜索