正文:
Win32 App 程式生與死:
(1)注冊視窗
(2)建立視窗
(3)顯示并更新視窗
(4)消息循環( WM_QUIT 結束循環)
(5)退出
執行個體代碼:
思考:
1. Console App 入口點 是 main ; Win32 App 入口點是 WinMain ;那麼 MFC 入口點在哪裡 ?
2. 相對簡潔的 Win32 App ,複雜的 MFC Framework 強大在哪裡 ?
3. 大量的虛函數、複雜的宏,或者說 MFC Framework 背着我們使用者做了哪些事情 ?
2.3 Dynamic Creation(動态建立)
C++動态建立對象的困難在于,無法在程式執行期間,根據動态獲得的一個類名稱,要求程式産生一個對象。
在 RTTI 中,CRuntimeClass 對象記錄了類的 CreateObject 函數,在程式執行期間獲得類名稱,周遊連結清單找到名稱比對項,調用 CreateObject ,産生新對象。
C++ 動态類型相關
(1) typeid 運算子
(2)宏 [ RTTI ]
(3)模闆實參演繹 [STL iterator_traits]
C++在動态對象建立上一直是一個缺陷,據我說知,C# 有一項技術支援(反射)。
2.4 Persistence(永久儲存)機制
Persistence:将對象永久保留下來(寫入檔案),Persistence 機制,也就是Serialize(資料讀寫)。
Persistence 簡介
(1) MFC 提供 CObList 、CDWordArray 等類來支援 Persistence 。
(2) MFC 利用
DECLARE_SERIAL/IMPLIMENT_SERIAL
兩個宏來實作 Persistence 機制。
(3)個人覺得,Persistence 隻不過限定了一種檔案格式來存儲。普通程式員也可以很快設定一種檔案格式來存儲,不用受架構的限制,靈活性高且調試友善。
Windows 程式本質系事借着消息來維持脈動(消息驅動),并以 WM_ 開頭的常量開表示。
消息循着 Application Framework 規定的路線,遊走于各個對象之間,直到找到它的歸宿(消息處理函數)。找不到的話,Framework 最終把它交給 :DefWindowProc 函數處理。
MFC 消息分類
指令消息(WM_COMMAND):“使用者指令程式做些操作”。凡是 UI 對象産生的消息都是這種指令消息,可能來自菜單或者加速鍵或工具欄按鈕,并且都以 WM_COMMAND 呈現。SDK 程式主要靠 wParam 識别之,MFC 程式則主要靠菜單項的識别碼( menu ID)識别——其實兩者是一樣的。
凡是派生自 CCmdTarget 的類,都由資格接受指令消息。
标準消息:除 WM_COMMAND 之外,任何以 WM_ 開頭的都算這一類,均可接受此消息。
Control Notification:由控件産生,為的是向父類視窗通知某種情況。例如當你在 ListBox 上選擇其中一個項目,ListBox 就會産生 LBN_SELCHANGE 傳送給父視窗。這類消息是以 WM_COMMAND 形式呈現。
MFC 線程分類:Work Thread,UI Thread
差別:Work Thread 沒有消息循環
UI Thread 有自己的消息和隊列循環
Work Thread:通常用來執行背景計算和維護任務,如冗長的計算過程,列印機的背景列印等
UI Thread:一般用于處理獨立于其他線程執行之外的使用者輸入,響應使用者及系統所産生的事件和消息等。
4.1 Work Thread的建立
CWinThread*
AfxBeginThread(AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
線程函數類型:
UINT ExecutingFunction(LPVOID pParam);
4.2 UI Thread的建立
CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,
int nPriority=THREAD_PRIORITY_NORMAL,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
略(幻燈片中講了一些,但是比較雜碎,就不在這裡列出來了……)