日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC 宏常识

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC 宏常识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、宏就是用宏定義指令#define定義一個標識符,用它來表示一個字符串或一段源代碼。

MFC宏作為MFC類庫的一個組成部分在MFC應用程序中經常出現。

MFC宏在路徑

".../Microsoft Visual Studio/VC/atlmfc/include"

下的Afxwin.h、Afx.h及Afxmsg_.h等MFC頭文件中分別進行了定義。

(1)常用的MFC宏

包括消息映射宏運行時類型識別宏序列化宏調試宏異常宏等。

要想真正了解MFC的內部機制和熟練運用MFC,必須掌握MFC宏的基本原理和使用方法。

(2)有關運行時類型識別的宏

運行時類型識別(RTTI)是指在程序運行時能夠確定一個對象的類型。

MFC擴充了一般C++中運行時類型識別的功能,當一個類支持MFC的運行時類型識別功能時,它允許程序獲取對象的信息(如類名、所占存儲空間大小及版本號等)和基類信息(RTCI)。

?

1.運行時基礎宏:RUNTIME_CLASS(class_name)

返回參數class_name所指定類的靜態成員變量class##class_name的指針,該指針指向一個CRuntime結構。

宏定義如下:

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

?

程序能夠利用RUNTIME_CLASS宏實時創建類的實例。

為了讓這個宏起作用,定義的類必須是類CObject的派生類,并且在派生類的定義中必須使用宏DECLARE_DYNAMIC、DECLARE_DYNCREATE或DECLARE_SERIAL,

在派生類的實現源文件中使用宏IMPLEMENT_DYNAMIC、IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL。

這三個宏使MFC類及其派生類具有三個不同等級的功能。

?

2.動態支持宏:DECLARE_DYNAMIC(class_name)和IMPELMENT_DYNAMIC(class_name,base_class_name)

使用動態支持宏能夠使CObject派生類的對象具有基本的類型識別機能,可以通過調用成員函數CObject::IsKindOf(ClassName)測試對象與給定類Class_Name的關系。

DECLARE_DYNAMIC()宏定義如下:

#define DECLARE_DYNAMIC(class_name) \ public: \ static const CRuntimeClass class##class_name; \ virtual CRuntimeClass* GetRuntimeClass() const; \

例1: 定義一個類MyClass,使用RUNTIME_CLASS()宏的基本對象識別功能

//在頭文件MyClass.h class CMyClass:public CObject { DECLARE_DYNAMIC(CMyClass) public: void someFunction(void); };//在實現源文件MyClass.cpp中 #include "MyClass.h" IMPLEMENT_DYNAMIC(CMyClass,CObject) void CMyClass::SomeFunction(void) { CObject* pObject=new CMyClass; if(pObject->IsKindOf(RUNTIME_CLASS(CMyClass))) { CMyClass* pMyObject=(CMyClass*)pObject; AfxMessageBox("MyObject is an object of the class CMyClass"); } else AfxMessageBox("MyObject is not an object of the class CMyClass"); delete pObject; }

?

3.動態創建宏:DECLARE_DYNCREATE(class_name)和 IMPLEMENT_DYNCREATE(class_name,base_class_name)

動態創建是動態支持的一個超集,除了基本的類型識別機能,使用動態創建宏能夠使CObject類的派生類具有運行時動態創建對象的功能。

注意,支持動態創建的類必須有一個默認的不帶參數的構造函數,用于一個穩定的對象。

MFC應用程序框架利用這個機能動態創建新的對象。

?

例如,當序列化期間從磁盤讀取一個對象時,應用程序框架將利用文檔類、視圖類和框類的動態創建功能業動態創建它們的運行時對象。

在MFC應用程序框架中,向導為MFC派生類自動添加了這兩個動態創建宏。

?

4.序列化:DECLARE_SERIAL()和IMPLEMENT_SERIAL()

序列化是動態支持和動態創建的一個超集,除了基本的類別識別和動態創建機能,使用序列化宏能夠使CObject類的派生類具有實現對象持久性的序列化功能。


MFC調試宏

1.TRACE跟蹤聲明宏

??? TRACE()宏語法說明如下:

TRACE(<輸出格式>,<表達式>)

其中的參數是由輸出格式和表達式組成,其形式與函數printf()的參數一樣。

TRACE宏的功能是在調試運行時把表達式的值輸出到Output調試窗口。

TRACE宏只在MFC應用程序Debug版的調試運行狀態下才起作用,并且必須保證在Developer Studio中的Enable tracing設置,這需要執行Tools|MFC Tracer命令。

?

例2 對于以下代碼:

char* szName="LiMing"; int nAge=18; TRACE("Name=%s,Age=%",szName,nAge); 調試運行時在Ouput窗口將輸出以下內容:Name=LiMing,Age=18

?

2.ASSERT斷言宏?

ASSERT(<表達式>)

當執行該宏時,如果表達式為真,則程序繼續執行;否則暫停程序的運行,并彈出一個對話框,告訴用戶程序暫停運行的行及所在文件的信息。用戶可選擇終止運行、調試程序或繼續運行。

例如,在視圖派生類的成員函數GetDocument()中,MFC使用了ASSERT()宏判斷當前文檔是否是運行時類的對象。

?? 例3 :設已自定義一個名為CMyFrame的框架窗口類,它也是CFrameWnd的派生類。在程序中構建一個與CMyFrame相關聯的文檔模板對象,并為構建的文檔模板創建框架窗口。然后可以編寫如下代碼使用這個框架窗口。

CMyFrame* pFrame=(CMyFrame*)AfxGetMainWnd(); ASSERT(pFrame->IsKindOf(RUNTIME_CLASS(CMyFrame))); //判斷pFrame的類型 pFrame->DoSomeOperation(); //調用成員函數完成某些操作

AfxGetMainWnd()是一個全局函數,返回值向應用程序主窗口的指針,類型為CWnd*,因此必須對它進行強制類型轉換。但如何知道是否轉換成功?

CMyFrame類也是CObject的派生類,可以結合成員函數IsKindOf()使用ASSERT()宏來檢查pFrame的類型。

在pFrame->DoSomeOperation()語句之前插入ASSERT()宏,就可以在運行機制時做類型檢查,當類型不匹配時,引發一個斷方,可以中斷程序執行。

ASSERT宏只在Debug版本中才起作用,它在Release版本中是不會被編譯的,

?

在Release版本中可以使用VERIFY宏。VERIFY宏與ASSERT宏在Debug版本中的作用一致,

區別在于在Release版本中VERIFY宏仍然有效,它會對參數表達式求值,但不管結果如何都不會暫停程序的運行。

為了避免給程序帶來不良的后果,使用ASSERT宏時必須保證參數表達式中不能有函數調用語句,

因為ASSERT宏中的函數調用語句在Release版本中根本不在。

出現這種情況時,可以使用VERIFY宏取代ASSERT宏。

?

3.ASSERT_VALID斷言有效宏

ASSERT_VALID()宏語法說明如下:

ASSERT_VALID(<指針>)

ASSERT_VALID宏用于檢查指針和對象的有效性。對于一般指針,只檢查指針是否為空。

對于MFC類對象指針,通過調用CObject類的成員函數AssertValid()判斷對象的舍法性。

ASSERT_VALID宏提示指針或對象無效的方式與ASSERT宏一樣,彈出一個信息對話框。

ASSERT_VALID宏也是只在Debug版本中才起作用。



總結

以上是生活随笔為你收集整理的MFC 宏常识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男人天堂亚洲天堂 | 啪啪日韩 | 久久免费看片 | 亚洲精品1区2区3区 国产丝袜网站 | 色一五月 | 我和公激情中文字幕 | 韩国三级视频在线观看 | 在线一区二区不卡 | 成人中文字幕+乱码+中文字幕 | 亚洲熟妇国产熟妇肥婆 | аⅴ天堂中文在线网 | 99riav国产 | eeuss一区二区三区 | 国产三级短视频 | 超碰最新上传 | xxx国产在线观看 | 亚洲成人h| 日韩午夜免费视频 | 阿v视频免费在线观看 | 精品国产成人 | 五月天青青草 | 亚洲无线观看 | 天天综合亚洲 | 好男人在线视频 | 亚洲av无一区二区三区久久 | 手机看片1024日韩 | 91偷拍一区二区三区精品 | 快色在线观看 | 日日骚一区二区 | 国产aaaaaa | 久久久久久69 | 日韩毛片一区 | 精品影视| 午夜影院免费看 | 欧美xxxx83d| 久在操 | 久久久www成人免费无遮挡大片 | 欧美性生交大片免费看app麻豆 | 亚洲爱爱av | 日韩欧美色 | 99视频只有精品 | 波多野结衣家庭主妇 | 欧美a∨ | 影音先锋中文字幕资源 | 视频在线播 | 99久久视频 | 国产精品无码中文 | 国产乱码精品一区二三区蜜臂 | 黄色成人免费视频 | 亚洲国产欧美精品 | 女18毛片 | 国产成人无码精品久久 | 91精品国产综合久久国产大片 | 四虎影院永久地址 | www免费视频| 中文字幕av一区二区三区人妻少妇 | 扶她futa粗大做到怀孕 | 日本美女视频一区 | 免费成人黄色网址 | 91亚洲精品久久久蜜桃借种 | 亚欧视频在线观看 | 成人av动漫 | 在线播放你懂得 | 日韩91av| 综合激情婷婷 | 少妇高潮一区二区三区喷水 | 久久精品国产免费 | 亚洲另类天堂 | 国产精品久久久久久久成人午夜 | 国模丫头1000人体 | 日韩中文一区二区 | 福利二区| 四虎在线影视 | 嫩草影院永久入口 | 虫族全黄h全肉污文 | 亚洲女优在线观看 | 欧洲黄视频 | 日本中文字幕在线观看 | 张柏芝亚洲一区二区三区 | 久久久久久久国产视频 | 欧美日韩一区二区精品 | 国产21页| 亚洲色欲色欲www | 欧美片免费网站 | 免费在线色| 97在线视频人妻无码 | 日日夜夜综合网 | 国产又黄又粗又爽 | 欧美专区一区 | 日韩怡红院 | 国产又粗又猛又爽又黄91精品 | 久久久久久久久久影视 | 182tv午夜 | 久久亚洲免费 | www欧美精品| 少妇一区二区三区四区 | 91精品推荐 | 免费网站观看www在线观看 | 国产精品高潮呻吟av |