很不錯的一篇文章,不少不明白的地方在此講的很清楚,很完整,主要是MFC的宏定義了.站長黑森林推薦!c++
AND_CATCHAND_CATCH 框架
AND_CATCH(exception_class,exception _object_point_name) 函數
說明: 工具
定義一個代碼塊,它用於獲取廢除當前TRY塊中的附加異常類型。使用CATCH宏以得到一個異常類型,而後使用AND_CATCH宏得到隨後的異常處理代碼能夠訪問異常對象(若合適的話)已獲得關於異常的特別緣由的更多消息。在AND_CATCH塊中調用THROW_LAST宏以便把處理過程移到下個外部異常框架。AND_CATCH可標記CATCH或AND_CATCH塊的末尾。 指針
註釋: 調試
AND_CATCH塊被定義成爲一個C++做用域(由花括號來描述)。若用戶在此做用域定義變量,那麼記住他們只在此做用域中能夠訪問。他也用於exception_object_pointer_name變量。 對象
ASSERT 接口
ASSERT(booleanExpression) 內存
說明: 資源
計算變量的值。若是結構的值爲0,那麼此宏便打印一個診斷消息而且成訊運行失敗。若是條件爲非0,那麼什麼也不作。 診斷消息的形式爲: assertion failed in file in line 其中name是元文件名,num是源文件中運行失敗的中斷號。 在Release版中,ASSERT不計算表達式的值也就不中斷程序。若是必須計算此表達式的值且無論環境如何那麼用VERIFY代替ASSERT。
註釋:
ASSERT只能在Debug版中用
ASSERT_VAILD
ASSERT_VAILD(pObject)
說明:
用於檢測關於對象的內部狀態的有效性。ASSERT_VALID調用此對象的AssertValid成員函數(把它們做爲本身的變量來傳遞)。在Release版中ASSERT_VALID什麼也不作。在DEBUG版中,他檢查指針,以不一樣於NULL的方式進行檢查,並調用對象本身的AssertValid成員函數。若是這些檢測中有任何一個失敗的話,那麼他會以與ASSERT相同的方法顯示一個警告的消息。
註釋:
此函數只在DEBUG版中有效。
BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP(the class,baseclass)
說明:
使用BEGIN_MESSAGE_MAP開始用戶消息映射的定義。在定義用戶類函數的工具(.cpp)文件中,以BEGIN_MESSAGE_MAP宏開始消息映射,而後爲每一個消息處理函數增長宏項,接着以END_MESSAGE_MAP宏完成消息映射。
CATCH
CATCH(exception_class,exception_object_pointer_name)
說明:
使用此用定義一個代碼塊,此代碼用來獲取當前TRY塊中都一個異常類型。異常處理代碼能夠訪問異常對象,如何合適的話,就會獲得關於異常的特殊緣由的更多消息。調用THROW_LAST宏以把處理過程一下一個外部異常框架,若是exception-class是類CExceptioon,那麼會獲取全部異常類型。用戶可使用CObject::IsKindOf成員函數以肯定那個特別異常被排除。一種獲取異常的最好方式是使用順序的AND_CATCH語句,每一個帶一個不一樣的異常類型。此異常類型的指針由宏定義,用戶沒必要定義。
註釋:
此CATCH塊被定義做一個C++範圍(由花括號描述)。如用戶在此範圍定義變量,那麼它們只在吃範圍內能夠訪問。他還能夠用於異常對象的指針名。
DEBUG_NEW
#define new DEBUG_NEW
說明:
幫助查找內存錯誤。用戶在程序中使用DEBUG_NEW,用戶一般使用new運算符來從堆上分配。在Debug模式下(但定義了一個DEBUG符號),DEBUG_NEW爲它分配的每一個對象記錄文件名和行號。而後,在用戶使用CMemoryState::DumpAllObjectSince成員函數時,每一個以DEBUG_NEW分配的對象分配的地方顯示出文件名和行號。 爲了使用DEBUG_NEW,應在用戶的資源文件中插入如下指令: #define new DEBUG_NEW 一旦用戶插入本指令,預處理程序將在使用new的地方插入DEBUG_NEW,而MFC做其他的工做。但用戶編譯本身的程序的一個發行版時,DEBUG_NEW便進行簡單的new操做,並且不產生文件名和行號消息。
DECLARE_DYNAMIC
DECLARE_DYNAMIC(class_name)
說明:
但從CObject派生一個類時,此宏增長關於一個對象類的訪問運行時間功能。把DECLARE_DYNAMIC宏加入類的頭文件中,而後在所有須要訪問詞類對象的.CPP文件中都包含此模塊。若是像所描述那樣使用DELCARE_DYNAMIC和IMPLEMENT_DYNAMIC宏,那麼用戶即可使用RUNTIME_CLASS宏和CObject::IsKindOf函數以在運行時間決定對象類。若是DECLARE_DYNAMIC包含在類定義中,那麼IMPLEMETN_DYNAMIC必須包含在類工具中。
DECLARE_DYNCREATE
DECLARE_DYNCREATE(class_name)
說明:
使用DECLARE_DYNCRETE宏以便容許CObject派生類的對象在運行時刻自動創建。主機使用此功能自動創建新對象,例如,但它在串行化過程當中從磁盤讀一個對象時,文件及視圖和框架窗應該支持動態創建,由於框架須要自動創建它。把DECLARE_DYNCREATE宏加入類的.H文件中,而後在所有須要訪問此類對象的.CPP文件中包含這一模式。若是DECLARE_DYNCREATE包含在類定義中,那麼IMPLEMENT_DYNCREATE必須包含在類工具中。
DECLARE_MESSAGE_MAP
DECLARE_MESSAGE_MAP()
說明:
用戶程序中的每一個CCmdTarget派生類必須提供消息映射以處理消息。在類定義的末尾使用DECLARE_MESSAGE_MAP宏。接着,在定義類成員函數的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,每一個用戶消息處理函數的宏項下面的列表以及END_MESSAGE_MAP宏。
註釋:
若是在DECLARE_MESSAGE_MAP以後定義任何一個成員,那麼必須爲他們指定一個新存取類型(公共的,私有的,保護的)。
DECLARE_SERIAL
DECLARE_SERIAL(class_name)
說明:
DECLARE_SERIAL爲一個能夠串行化的CObject派生類產生必要的C++標題代碼。串行化是把某個對象的內容從一個文件讀出和寫入一文件。在.H文件中使用DECLARE_SERIAL宏,接着在須要訪問此類對象的所有.CPP文件中包含此文件。若是DECLARE_SERIAL包含在類定義中,那麼IMPLEMENT_SERIAL必須包含在類工具中。DECLARE_SERIAL宏包含所有DECLARE_DYNAMIC,IMPLEMENT_DYCREATE的功能。
END_CATCH
END_CATCH
說明:
標識最後的CATCH或AND_CATCH塊的末尾。
END_MESSAGE_MAP
END_MESSAGE_MAP
說明:
使用END_MESSAGE_MAP宏結束用戶的消息映射定義
IMPLEMENT_DYNAMIC
IMPLEMENT_DYNAMIC(class_name,base_class_name)
說明:
經過運行時在串行結構中爲動態CObject派生類訪問類名和位置來產生必要的C++代碼。在.CPP文件中使用IMPLEMENT_DYNAMIC宏,接着一次連接結果對象代碼
IMPLEMENT_DYNCREATE
IMPLEMENT_DYNCREATE(class_name,base_class_name)
說明:
經過DECLARE_DYNCREATE宏來使用IMPLEMENT_DYNCREATE宏,以容許CObject派生類對象在運行時自動創建。主機使用此功能自動創建對象,例如,但它在串行化過程當中從磁盤讀去一個對象時,他在類工具里加入IMPLEMENT_DYNCREATE宏。若用戶使用DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏,那麼接着使用RUNTIME_CLASS宏和CObject::IsKindOf成員函數以在運行時肯定對象類。若declare_dyncreate包含在定義中,那麼IMPLEMENT_DYNCREATE必須包含在類工具中。
IMPLEMENT_SERIAL
IMPLEMENT_SERIAL(class_name,base_class_name,wSchema)
說明:
經過運行時在串行結構中動態CObject派生類訪問類名和位置來創建必要的C++代碼。在.CPP文件中使用IMPLEMENT_SERIAL宏,而後一次連接結果對象代碼。
ON_COMMAND
ON_COMMAND(id,memberFxn)
說明:
此宏經過ClassWizard或手工插入一個消息映射。它代表那個函數將從一個命令用戶接口(例如一個菜單項或toolbar按鈕)處理一個命令消息。當一個命令對象經過指定的ID接受到一個Windows WM_COMMAND消息時,ON_COMMAND將調用成員函數memberFxn處理此消息。在用戶的消息映射中,對於每一個菜單或加速器命令(必須被映射到一個消息處理函數)應該確實有一個ON_COMMAND宏語句。
ON_CONTROL
ON_CONTROL(wNotifyCode,id,memberFxn)
說明:
代表哪一個函數將處理一個常規控制表示消息。控制標識消息是那些從一個控制夫發送到母窗口的消息。
ON_MESSAGE
ON_MESSAGE(message,memberFxn)
說明:
指明哪一個函數將處理一用戶定義消息。用戶定義消息一般定義在WM_USER到0x7FF範圍內。用戶定義消息是那些不是標準Windows WM_MESSAGE消息的任何消息。在用戶的消息映射中,每一個必須被映射到一個消息處理函數。用戶定義消息應該有一個ON_MESSAGE宏語句。
ON_REGISTERED_MESSAGE
ON_REGISTERED_MESSAGE(nmessageVarible,memberFxn)
說明:
Windows的RegisterWindowsMesage函數用於定義一個新窗口消息,此消息保證在整個系統中是惟一的。此宏代表哪一個函數處理已註冊消息。變量nMessageViable應以NEAR修飾符來定義。
ON_UPDATE_COMMAND_UI
ON_UPDATE_COMMAND_UI(id,memberFxn)
說明:
此宏一般經過ClassWizard被插入一個消息映射,以指明哪一個函數將處理一個用戶接口個更改命令消息。在用戶的消息映射中,每一個用戶接口更改命令(比訊被映射到一個消息處理函數)應該有一個ON_UPDATE_COMMAND_UI宏語句。
ON_VBXEVENT
ON_VBXEVENT(wNotifyCode,memberFxn)
說明:
此宏一般經過ClassWizard被插入一個消息映射,以指明哪一個函數將處理一個來自VBX控制的消息。在用戶的消息映射中每一個被映射到一消息處理函數的VBX控制消息應該有一個宏語句。
RUNTIME_CLASS
RUNTIME_CLASS(class_name)
說明:
使用此宏從c++類民衆獲取運行時類結構。RUNTIME_CLASS爲由class_name指定的類返回一個指針到CRuntimeClass結構。只有以DECLARE_DYNAMIC,DECLARE_DYNCREATE或DECLARE_SERIAL定義的CObject派生類才返回到一個CRuntimeClass結構的指針。
THROW
THROW(exception_object_pointer)
說明:
派出指定的異常。THROW中斷程序的運行,把控制傳遞給用戶程序中的相關的CATCH塊。若是用戶沒有提供CATCH塊,那麼控制被傳遞到一個MFC模塊,他打印出一個錯誤並終止運行。
THROW_LAST
THROW_LAST()
說明:
此宏容許用戶派出一個局部創建的異常。若是用戶試圖排除一個剛發現的異常,那麼通常此異常將溢出並被刪除。使用THROW_LAST,此異常被直接傳送到下一個CATCH處理程序。
TRACE
TRACE(exp)
說明:
把一個格式化字符串送到轉儲設備,例如,文件或調試監視器,而提供與printf類似的功能。同MS_DOS下C程序的printf同樣,TRACE宏是一個在程序運行時跟蹤變量值的方便形式。在DEBUG環境中,TRACE宏輸出到afxDump。在Release版中他不作任何工做。
註釋:
此宏只在MFC的DEBUG版中有效。
TRACE0
TRACE0(exp)
說明:
與TRACE類似,但他把跟蹤字符串放在代碼段中,而不是DGROUP,所以使用少的DGROUP空間。TRACE0是一組跟蹤宏的一個變體,這些宏可用於調試輸出。這一組包括TRACE0,TRACE1,TRACE2和TRACE3,這些宏不一樣在於所取參數的數目不一樣。TRACE0只取一個格式化字符串並可用於簡單文本消息。TRACE1取一格式化字符串加上一個變量——一個將轉儲的變量。一樣,TRACE2,TRACE3分別取2個或3個參數(在格式化字符串以後)。若是用戶以便以了應用程序的發行版,那麼它只把數據轉儲到afxDump。
註釋:
此宏只在MFC的DEBUG中有效。
TRACE1
TRACE1(exp,param1)
說明:
參見TRACE0
TRACE2
TRACE2(exp,param1,param2)
說明:
參見TRACE0
TRACE3
TRACE3(exp,param1,param2,param3)
說明:
TRY
TRY
說明:
使用此宏創建一TRY塊。一個TRY識別一個可排除異常的代碼塊。這些異常在隨後的CATCH和AND_CATCH塊處理。傳遞是容許的:異常能夠傳遞一個外部TRY塊,或者忽略它們或者使用THROW_LAST宏。
VERIFY
VERIFY(booleanExpression)
說明:
在MFC的DEBUG版中,VERIFY宏計算它的變量值。 若是結果爲0,那麼宏打印一個診斷消息並停止程序。若是條件不爲0,那麼什麼工做也不做。 診斷有以下形式: assertion failed in file in line 其中name是源文件的名字,num是在源文件中失敗的停止行號。在MFC的Release版中,VERIFY計算表達式值但不打印或停止程序。例如:若是表達式是個函數調用,那麼調用成功。