天天看點

MFC 架構技術簡單研讨

正文:

Win32 App 程式生與死:

(1)注冊視窗

(2)建立視窗

(3)顯示并更新視窗

(4)消息循環( WM_QUIT 結束循環)

(5)退出

執行個體代碼:

MFC 架構技術簡單研讨
MFC 架構技術簡單研讨

思考:

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);

  略(幻燈片中講了一些,但是比較雜碎,就不在這裡列出來了……)

繼續閱讀