MFC邊看邊記

  好吧,不能再拖了,爲了逼自己儘快搞定呢MFC,決定邊看<<深入淺出MFC>>邊記筆記,用最快的速度搞定它以便開始進行後續的開發。

  第一章: win32基礎

     該章節一上來先講win32應用程序設計,筆者認爲這是MFC的基礎,趕緊打開VS2008創建一個win32項目,果然比控制檯程序多了許多文件,看了下主cpp框架代碼,該框架生成一個默認的窗口程序。程序進入winmain後首先創建一個WNDCLASSEX類,設置其各項屬性並調用RegisterClassEx註冊該窗口類。然後調用CreateWindow創建主窗口,最後進入主消息循環代碼如下:

while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);//轉化鼠標鍵盤消息
DispatchMessage(&msg);//將消息傳遞給主窗口處理程序WndProc相應消息

}

在資源視圖中可以添加自己的對話框,菜單等並在WndProc寫代碼處理他們的消息。


窗口程序的生命週期:

        產生上面已經講了,只說關閉。當點擊關閉窗口時候,系統送出VM_close命令,應用程序不攔截該命令,交給default:DefWindowProc處理。DefWindowProc收到VM_CLOSE後調用destroywindow把窗口清除,同時送出WM_DESTROY,應用程序收到後調用PostQuitMessage結束消息循環 此時窗口程序才全部清理完畢。


空閒時間:

   getmessage和peekmessage不同,peekmessage在消息隊列沒有消息後仍然收回控制權,使程序得以執行一段時間。


控制檯程序也可以調用MFC類庫(必須與GUI無關的) 如CFILE 和CSTRING類,必須包含頭文件afx.h 編譯選項必須選擇C的多線程函數庫


本章最後提到了多線程,正好複習下內核驅動課程中的東西:三種創建線程的區別

  • CreateThread:是Windows的API函數(SDK函數的標準形式,直截了當的創建方式,任何場合都可以使用),提供操作系統級別的創建線程的操作,且僅限於工作者線程。不調用MFC和RTL的函數時,可以用CreateThread,其它情況不要使用。因爲:
             1.C Runtime中需要對多線程進行紀錄和初始化,以保證C函數庫工作正常。
             2.MFC也需要知道新線程的創建,也需要做一些初始化工作。
             3.有些CRT的函數象malloc(),fopen(),_open(),strtok(),ctime(),localtime()等函數需要專門的線程局部存儲的數據塊,這個數據塊通常需要在創建線程的時候就建立,如果使用CreateThread,這個數據塊就沒有建立,但函數會自己建立一個,然後將其與線程聯繫在一起,這意味着如果你用CreateThread來創建線程,然後使用這樣的函數,會有一塊內存在不知不覺中創建,而且這些函數並不將其刪除,而CreateThread和ExitThread也無法知道這件事,於是就會有Memory   Leak,在線程頻繁啓動的軟件中,遲早會讓系統的內存資源耗盡。

  • _beginthreadex:MS對C Runtime庫的擴展SDK函數,首先針對C Runtime庫做了一些初始化的工作,以保證C Runtime庫工作正常。然後,調用CreateThread真正創建線程。
  • AfxBeginThread:MFC中線程創建的MFC函數,首先創建了相應的CWinThread對象,然後調用CWinThread::CreateThread,在CWinThread::CreateThread中,完成了對線程對象的初始化工作,然後,調用_beginthreadex(AfxBeginThread相比較更爲安全)創建線程。它讓線程能夠響應消息,可用於界面線程,也可以用於工作者線程。

 第二章:c++特性

      看到內容我嚇一跳,要不要正麼巧啊,剛系統的學了下C++這就來給我複習了,不禁要爲我的學習計劃小小的得意一下~~。

    大概翻了一下沒有什麼新東西 直接跳過了


第三章:

      簡單的跟寫了下作者的RTTI機制,作者在每個類中加了個靜態類型成員 並把它放入全局鏈表中用以識別父子關係,真實C++RTTI則是維護了一棵繼承樹。

     這章看完後對MFC的實現細節有了直觀的影響。後面的章節感覺有點亂,直接開始跟代碼得了

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章