Visual C++ MFC 中常用巨集的含義

weixin_30639719發表於2020-04-05
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計算表示式值但不列印或中止程式。例如:如果表示式是個函式呼叫,那麼呼叫成功。

轉載於:https://www.cnblogs.com/Dtor/archive/2006/07/31/464144.html

相關文章